Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: How to check if a variable's value is equal to a member of a list of values

by CountOrlok (Friar)
on Mar 25, 2013 at 13:16 UTC ( #1025295=note: print w/replies, xml ) Need Help??


in reply to How to check if a variable's value is equal to a member of a list of values

There are several ways. Fastest is probably to put the 1000+ values in a hash (as the keys, let their value be 1 if you don't care otherwise. Then you just need to check if exists($myhash{$variable})

Another way available since version 5.10, I believe, is if your 1000+ values are in an array you can do if (@myarray ~~ $variable) { #do something }

Replies are listed 'Best First'.
Re^2: How to check if a variable's value is equal to a member of a list of values
by McA (Priest) on Mar 25, 2013 at 14:04 UTC

    Hi,

    intersting: Because I'm curious: Is this substantially different (memory footprint, performance) than:

    if(grep { $_ eq $string } @array) {

    McA

      It should

    • smartmatch is implemented in C
    • grep doesn't stop after matching.

      Unfortunately all the use cases of smartmatch are hard to remember.

      For repeated lookups a prepared hash scales certainly better.

      You're free to check this with benchmarks or search for older discussions.

      I hoped smartmatch could at least handle the stringification limitation of hashes, but nope:

      DB<141> $h1={} => {} DB<142> $h1 ~~ [$h1] => "" DB<143> 5 ~~ [5] => 1

      Cheers Rolf

      ( addicted to the Perl Programming Language)

      Update

      ) Brian got deep into benchmarking :) http://stackoverflow.com/questions/3951812/how-fast-is-perls-smart-match-operator-for-searching-scalar-in-an-array

        Thank you. An intersting link. I have to admit that I haven't worked with the smart match operator. It's a little bit too much "Eierlegendenwollmilchsau" (1) for me. And what I read about it confirmed to wait with it. But probably I'm too old fashioned.

        McA

        (1) Best translation I could find on dict.leo.org: jack of all trades device

      Just to toss in a tidbit, and not trying to hijack the thread, but while benchmarking an alternative to using the smart match operator, I discovered that using map in scalar content performed better than grep.
      if( map { /$string/ } @array) {
      rather than...
      if( grep { /$string/ } @array) {

      I was surprised, because either way you'd be getting a non-undef value to satisfy the conditional, but map did it faster. I can post my code in a new thread if anyone's interested, otherwise, carry on! :)
        grep { TEST } LIST is semantically equivalent to map { TEST ? $_ : () } LIST

        Seems obvious that more logic results in longer runtime.

        Don't you think so?

        Cheers Rolf

        ( addicted to the Perl Programming Language)

Re^2: How to check if a variable's value is equal to a member of a list of values
by mje (Curate) on Mar 25, 2013 at 16:35 UTC

    Be careful as on newer perl versions:

    $ perl -le '@a = (1,2,3); print "fred\n" if @a ~~ 1;' # prints nothing $ perl -le '@a = (1,2,3); print "fred\n" if 1 ~~ @a;' fred

    I think it changed at 5.10.1 but I didn't check that.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1025295]
help
Chatterbox?
[stevieb]: yeah, so the wiringPi library appears to be missing/injecting incorrect defined variables into I2C calls, and it's all over the map. I'm going to have to revisit and use something else, write something else, or scrutinize the code and fix

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (3)
As of 2017-06-23 00:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How many monitors do you use while coding?















    Results (532 votes). Check out past polls.