Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

RE: RE: RE: Re: Populating a Hash: Can someone help me to understand?

by merlyn (Sage)
on Sep 19, 2000 at 19:43 UTC ( #33105=note: print w/replies, xml ) Need Help??


in reply to RE: RE: Re: Populating a Hash: Can someone help me to understand?
in thread Populating a Hash: Can someone help me to understand?

A hash can only have one value per key. What is it you are really trying to do?

-- Randal L. Schwartz, Perl hacker

  • Comment on RE: RE: RE: Re: Populating a Hash: Can someone help me to understand?

Replies are listed 'Best First'.
RE: RE: RE: RE: Re: Populating a Hash: Can someone help me to understand?
by Limo (Scribe) on Sep 19, 2000 at 19:49 UTC
    Well, I AM trying to create a hash with multiple values per key! Apparently, this is possible. I'm referring to "Perl Cookbook", pg. 140. There is an example of this, but I'm having a hard time understanding it.
      Okay. I think I see what you're trying to do now. Based on what I see in the Cookbook on p 140, it looks like you want a hash whose values are array refs. This will effectively get you the "more than one value per hash key" that you're looking for. It is kind of hard to tell what to help you with regarding that particular example without a little smaller target for us to aim for.
      The example is fairly simple, except for the fact that instead of assigning values to an array, then setting the array reference to a hash key, it pushes values directly into the hash.
      BTW: here is the code I'm referring to:
      %ttys = (); open(WHO,"who|") or die "can't open who: $!"; while (<WHO>) { ($user, $tty) = split; push( @{$ttys{$user}}, $tty); } foreach $user (sort keys %ttys) { print "$user: @{$ttys{$user}}\n"; }

      The one line that looks like it might cause understanding problems is push( @{$ttys{$user}}, $tty); Basically, push expects a list for its forst argument, but $ttys{$user} will return a list refernce, not a list. Using @{...} forces push to evaluate what's in those braces as a list, which it knows how to work with.

      Guildenstern
      Negaterd character class uber alles!

        I find that removing the autovivication can make the code easier to understand (and I wish there was a way to force this):

        my %ttys= (); open( WHO, "who|" ) or die "Can't fork to read from who: $!"; while( <WHO> ) { my( $user, $tty )= split; if( ! exists $ttys{$user} ) { $ttys{$user}= [$tty]; } else { push @{$ttys{$user}}, $tty; } } foreach my $user ( sort keys %ttys ) { print "$user: @{$ttys{$user}}\n"; }

        The if shows a bit of what happens under the covers in the previous example.

                - tye (but my friends call me "Tye")
        That's what I was asking in my original post,"I've read about references from several sources; I think referencing the arrays are my answer, but I'm just not getting it."

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (5)
As of 2020-05-30 15:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (173 votes). Check out past polls.

    Notices?