Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

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

by Jenda (Abbot)
on Mar 25, 2013 at 13:20 UTC ( #1025299=note: print w/ replies, xml ) Need Help??


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

And if the hash happens to grow too big, you can tie it to an optimized cached on disk hash using DB_File, BerkeleyDB or similar module.

One thing though, it's not necessary to store the 1 in the values. Keep them empty and use exists()

my %set; @set{@values} = (); ... if (exists $set{$key}) ...

Update: Fixed a syntax error (incorrect type of parens). Thanks go to choroba.

Jenda
Enoch was right!
Enjoy the last years of Rome.


Comment on Re^2: How to check if a variable's value is equal to a member of a list of values
Download Code
Re^3: How to check if a variable's value is equal to a member of a list of values
by cls33 (Novice) on Mar 25, 2013 at 15:24 UTC
    Seems like I'm on the right track, but this is a more elegant implementation. I was not previously familiar with the ability to suck an entire array into a hash using the @hash{@array}=() syntax.

    One quick syntactical question... using this method, how would I set each hash key to a defined static value? Using something like:

    @hash{@array}='MyValue';

    Only seems to set the value for the first key...
      > I was not previously familiar with the ability to suck an entire array into a hash

      it's called "hash slice"! see perldata#Slices

      > using this method, how would I set each hash key to a defined static value?

      assign a list of same length

      DB<156> @array=1..5 => (1, 2, 3, 4, 5) DB<157> @hash{@array} = ('my val') x @array => ("my val", "my val", "my val", "my val", "my val") DB<158> \%hash => { 1 => "my val", 2 => "my val", 3 => "my val", 4 => "my val", 5 => + "my val" }

      Cheers Rolf

      ( addicted to the Perl Programming Language)

      UPDATE

      for completeness TIMTOWTDI:

      $hash{$_}="my val" for @array

      has less of a memory footprint.

      and

       my %hash = map { $_ => "my val" } @array;

      is DRYer and makes sure the whole hash is reinitiated.

      You have to provide a list of values on the right hand side. For example, you can try:
      @hash1{@array} = ('value') x @array; @hash2{@array} = 0 .. $#array;
      لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
        Hm... makes sense. But how do I handle it if I don't know the size/length of the array? Do I really have to check that and then programmatically build an array in a loop? Or is there a syntactical shortcut?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1025299]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (4)
As of 2014-09-21 10:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (168 votes), past polls