Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

check if a value is in a given set

by Ratazong (Prior)
on Jul 24, 2012 at 14:26 UTC ( #983426=perlquestion: print w/ replies, xml ) Need Help??
Ratazong has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,

I want to check if a value is inside a set of predefined values. Which is the best way to do so? I came to the following solution, but somehow I have the feeling there must be a more elegant way...

my $var = "apple"; if (exists( { banana => 1, plum => 1, apple => 1, strawberry => 1, pea + => 1,}->{$var} )) { print "yes!\n"; } else { print "no.\n"; }
Rata (failing to google it himself)

Comment on check if a value is in a given set
Download Code
Re: check if a value is in a given set
by Anonymous Monk on Jul 24, 2012 at 15:33 UTC

    Smart-matching seems to work OK.

    use 5.010; my @set = qw/banana plum apple strawberry pear/; my $var = "apple"; if ($var ~~ @set) { say "yes"; }

    There are also hashes which might be a tad faster if your set is large.

    my %set = map { $_ => 1 } qw/banana plum apple strawberry pear/; if (exists $set{$var}) { say "yes"; }
Re: check if a value is in a given set
by choroba (Abbot) on Jul 24, 2012 at 15:34 UTC
    I tend to use hashes if the set is larger, but I stay with grep if not and the test is not repeated much:
    #!/usr/bin/perl use warnings; use strict; my @values = qw/banana plum apple strawberry pea/; my $var = 'apple'; my %hash; undef @hash{@values}; print exists $hash{$var} ? "yes\n" : "no\n"; print +(grep $_ eq $var, @values) ? "yes\n" : "no\n";
Re: check if a value is in a given set
by brx (Pilgrim) on Jul 24, 2012 at 15:40 UTC

    Elegant? Hard to say...

    Smartmatch:

    perl -e 'my @t=qw/banana plum apple strawberry pea/;my $fruit="apple"; +print (($fruit~~\@t)?"yes":"no");' yes

    Undef hash:

    perl -e 'my @t=qw/banana plum apple strawberry pea/;my $fruit="apple"; +my %in;undef @in{@t};print ((exists $in{$fruit})?"yes":"no");' yes

    for,next,last:

    perl -e 'my @t=qw/banana plum apple strawberry pea/;my $fruit="apple"; +for my $f (@t) {next if $fruit ne $f;print "yes";last}' yes

    grep?

    #no, not efficient

    English is not my mother tongue.
    Les tongues de ma mère sont "made in France".
Re: check if a value is in a given set
by 2teez (Priest) on Jul 24, 2012 at 15:51 UTC

    I will probably write this using List::Util like so:

    #!/usr/bin/perl use warnings; use strict; use List::Util qw(first); my $var = 'apple'; my $h_ref = { banana => 1, plum => 1, apple => 1, strawberry => 1, pea => 1, }; my $foo = first { $_ eq $var } keys %{$h_ref}; defined $foo ? print "yes" : print "No";
    If your $var exist, it prints "Yes", if not you get a "No"

      You have a set of hash keys, and enumerate through them to find whether the one you seek exists?

Re: check if a value is in a given set
by hippo (Curate) on Jul 24, 2012 at 16:21 UTC
Re: check if a value is in a given set
by Marshall (Prior) on Jul 25, 2012 at 03:48 UTC
    I want to check if a value is inside a set of predefined values.

    I would use grep.

    #!/usr/bin/perl -w use strict; my @fruits = qw(banana plum apple strawberry pea); if ( grep {/apple/}@fruits ) #perhaps /^apple$/ { print "apple found!\n"; } else { print "apple not fouund\n"; } __END__ apple found!
    There are other ways see: List::Util

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://983426]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (12)
As of 2014-08-29 13:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (280 votes), past polls