Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
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 }


Comment on Re: How to check if a variable's value is equal to a member of a list of values
Select or Download Code
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?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (8)
As of 2015-07-05 20:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (68 votes), past polls