Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
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
Replies are listed 'Best First'.
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 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 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 pondering the Monastery: (16)
As of 2015-07-29 12:55 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 (263 votes), past polls