Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Populating a Hash: Can someone help me to understand?

by Limo (Scribe)
on Sep 19, 2000 at 19:03 UTC ( #33098=perlquestion: print w/ replies, xml ) Need Help??
Limo has asked for the wisdom of the Perl Monks concerning the following question:

What I'd like to do is create:
my %hash;
where:
@keys = hash keys @values = key values
I've read about references from several sources; I think referencing the arrays are my answer, but I'm just not getting it.

Comment on Populating a Hash: Can someone help me to understand?
Select or Download Code
Re: Populating a Hash: Can someone help me to understand?
by ar0n (Priest) on Sep 19, 2000 at 19:08 UTC
    (ugly stuff removed, replaced with less ugly)
    map { $hash{$keys[$_]} = $vals[$_] } (0..$#keys);

    update
    but there are nicer, prettier ways to do this; as you'll probably see below...
      You said:
      while (my $key = shift @keys and my $value = shift @values) { $hash{$key} = $value; }
      And your code stops too quickly if either the key or the value is false.
      You updated:
      while (defined (my $key = shift @keys) and defined(my $value = shift @ +values)) { $hash{$key} = $value; }
      But even adding the defined test as you did doesn't help. Consider @keys = (1, 2, undef, 3, 4);. You'll never get to 3 or 4.

      What would work is:

      while (@keys and @values) { $hash{shift @keys} = shift @values; }

      -- Randal L. Schwartz, Perl hacker

        Hmmm. Something strange here.
        my @array = subroutine($file1, $list1); #foreach my $item(@array) { #print "$item\n"; # }
        Now, when I uncomment the foreach/print block, it prints as intended.
        However, when I add:
        my %hash; while (@keys and @values) { $hash{shift @keys} = shift @values; } foreach my $k (sort keys %hash) { print "$k => $hash{$k}\n"; }
        the program returns only one value per key, while @values contains several whitespace delimited elements.
Re: Populating a Hash: Can someone help me to understand?
by japhy (Canon) on Sep 19, 2000 at 19:10 UTC
    @hash{@keys} = @values;

    $_="goto+F.print+chop;\n=yhpaj";F1:eval
RE: Populating a Hash: Can someone help me to understand?
by Adam (Vicar) on Sep 19, 2000 at 19:44 UTC
(Guildenstern: Hash Slice?) RE: Populating a Hash: Can someone help me to understand?
by Guildenstern (Deacon) on Sep 19, 2000 at 20:14 UTC
    Why can't you just use a hash slice? Like this:@hash{@keys} = @values;I imagine this would require that both arrays have equal numbers of values, but then any other kind of hash population would likely assume that as well.
    Update: Okay, so I missed the post by japhy. At least merlyn had the common courtesy to explain why he --'d it.

    Guildenstern
    Negaterd character class uber alles!

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2014-08-23 17:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (175 votes), past polls