in reply to Re^6: perl parsing
in thread perl parsing

Dumper had the correct info

If your output was like this

$VAR1 = { 'ryan' => [ 'ipad', '2005', 'cell', '2009' ], 'Brian' => [ 'ipad', '2001', 'ipad', '2001', 'ipad', '2001' ], 'Andrew' => [ 'ipad', '2009' ] };

that is not a HashOfHashes, it is a HashOfArrays. push @{$hash{$name}},$col2,$col3 is creating 2 array element for each line of data

push @{$hash{$name}},"$col2,$col3" creates only 1 array element for each line. see push

A HashOfHashes (HoH) would be used if you wanted to replace multiple records the same with 1 record and a count, like this

while (<IN>){ s/^\s+|\s+$//g; # trim leading/trailing spaces my ($col1,$col2,$col3) = split /\s+/,$_,4; if ($col1 eq 'name'){ $name = $col2; } elsif ($col1 eq 'device') { #push @{$hash{$name}},"$col2\t$col3"; ++$hash{$name}{$col2}{$col3}; #HoH } else { # skip line } } close IN; foreach my $name (keys %hash){ print "$name\n"; foreach my $col2 (keys %{$hash{$name}}){ foreach my $col3 (keys %{$hash{$name}{$col2}}){ my $count = $hash{$name}{$col2}{$col3}; print "\t$col2\t$col3\t$count\n"; } } }
poj

Replies are listed 'Best First'.
Re^8: perl parsing
by cbtshare (Monk) on Oct 06, 2017 at 20:59 UTC

    I am guessing you made a typo, you meant push @{$hash{$name}},$col2,$col3 is creating 2 array element for each line of data and push @{$hash{$name}},"$col2\t$col3" creates only 1 array element for each line

    right?
      Both push @{$hash{$name}},"$col2,$col3" and push @{$hash{$name}},"$col2\t$col3" create only 1 array element for each line because of the double quotes enclosing the 2 variables. Using a comma or tab only changes the print output format.

      poj