Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re^3: Hash assignments using map

by varian (Chaplain)
on Feb 24, 2007 at 17:57 UTC ( [id://601899]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Hash assignments using map
in thread Hash assignments using map

njcodewarrior,
You're right in that the map function acts like a loop. Where is gets tricky is when you assign the output of the map function to a hash, because the hash assignment operation evaluates two elements at a time. So Perl does the equivalent of this:
my $i=0; while ($i<$#group) { $hash{$group[$i]}=$group[$i+1]; $i+=2; }
As other monkers already pointed out the "odd number of elements" warning will be generated when you feed the hash with a group that has an odd number of elements.

Now if we look at the map function itself in your code

@destination = map {$_++} @source
The effect of the above code is that the elements are copied one by one. At the same time the element in the source (!) group is changed/incremented. Thatīs probably not what you wanted, right?

If the destination of the map function is a hash then commonly the map is used to produce 2 elements at a time in a list fashion:

.... = map { ("key$_" , "value$_") } .....
For clarity purpose the comma operator is typically replaced by a '=>' operator to indicate that we mean to produce something for a hash.
.... = map { ("key$_" => "value$_") } .....
I'm not sure what you hoped to achieve through your code but hopefully this shows why your code behaved as it did

Replies are listed 'Best First'.
Re^4: Hash assignments using map
by njcodewarrior (Pilgrim) on Feb 24, 2007 at 20:14 UTC

    Thanks varian. This makes sense.

    I want to quickly create a hash with keys that are the elements of the list. All I want access to is the keys...I don't care what the values are. I can then use exists to see if those keys either do or do not exist in another hash.

    Thanks again!

      All I want access to is the keys...
      ok, but a hash has a key and a value. So your code should be:
      my @keys = qw{ a b c d }; my %hash = map { $_,1 } @keys;
      if you want your keys unaltered. If you want a "string increment" ($_="a";$_++; # $_ is b now) its ok to use $_++.

      In the loop

      my %hash; foreach ( @keys ) { $hash{$_}++; }

      you are also using two variables - in a shortcut:

      1. you create a new hash slot with key $_
      2. you increment (the previously undefined) value for that key

      So, it's the same thing with keys and values here. With map iterating over an array of keys, you must provide a value to have pairs to be stored as (key,value) in a hash.

      --shmem

      _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                    /\_¯/(q    /
      ----------------------------  \__(m.====·.(_("always off the crowd"))."·
      ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (5)
As of 2024-04-23 18:33 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found