There are multiple logical design errors in the flow of your program. One of them is that you assign an arrayref to $hoa{$key} while you want it to be an arrayref itself, so you have to push your data in that array like push @{hoa{$key}}, [ @aoa ]. This assignment is also misplaced, as it will push an empty arrayref in case the line from <DATA> doesn't match any of the pattern you mentionned (/^\s+/ won't match an empty line by the way, /^$/ will).
Here's some code that will produce what you want. You may look at that solution (among others, as always) directly, or try and correct your code a bit by yourself first.
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $key; my %hoa; while ( <DATA> ) { chomp; next if (/^$/); if ( /^SET/ ) { $key = (split)[1]; # perldoc -f split } elsif (/^\d/) { push @{$hoa{$key}}, [ split /,/ ]; # perldoc -f split } } print Dumper \%hoa ; __DATA__ SET: SET1 0,100,BOOK 1,150,PENCIL ==== SET: SET2 2,110,ERASER 2,200,PEN 0,220,BLACKBOARD 1,300,CHALK ====
Update: updated explanations a bit, small updates to the code.
In reply to Re: Fail to update an array in HoAoA
by Fang
in thread Fail to update an array in HoAoA
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |