Re: HoH problem representing a data structure.

[email protected] (Rob Dixon)
Newsgroups perl.beginners
Message-ID <[email protected]>
Rodrick Brown wrote:
> On Sun, Jun 8, 2008 at 10:37 AM, Gunnar Hjalmarsson <[email protected]>
> wrote:
> 
>> Rodrick Brown wrote:
>>
>>> #!/usr/bin/perl -w
>>>
>> The -w switch is redundant, since you have "use warnings;".
>>
>>  use strict;
>>> use warnings;
>>> use Data::Dumper;
>>> my $file = '/etc/passwd';
>>> my $hash;
>>> my ($user, $homeDir);
>>> my $count=0;
>>>
>> Why did you declare that variable?
>>
>>  open(my $fh, "<", $file) or die("Fatal error unable to read $file: $!");
>>> while(<$fh>) {
>>>  next if /^#/;
>>>  ($user, $homeDir) = (split /:/,$_)[0,5];
>>>  $hash->{$homeDir} = $user;
>>>
>> You probably want:
>>
>>    push @{ $hash->{$homeDir} }, $user;
>>
>>  }
>>> print Dumper($hash);
>>
> Yes please explain how exactly that line works? I know @{} dereferences an 
> array so it looks like your pushing each user into an anonymous array.

Exactly. The value of a hash element can only be a scalar, and so must represent
a list of items using a reference to an anonymous hash. The syntax

  push @{ $hash->{$homeDir} }, $user;

is concise because of 'autovivifaction', which will initialise the hash element
with an implied

  $hash->{$homeDir} = [];

if it doesn't already exist.

You should take a look at

  perldoc perlref

and

  perldoc perllol


to understand further.

HTH,

Rob
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.