And to complete derby's point: you don't need to test whether the hash entry exists - if it doesn't, Perl will automagically create an anonymous array and store it in there for you.
It looks like you're not using strict and warnings - get in the habit of doing so. Yes, they're annoying at first, but they'll catch a lot of very simple but very hard to find mistakes (such as typos in variable names) for you. Also, note that shift returns the element it just removed from the front of the array, so you can directly assign it to $tag rather than doing the whole thing in two steps.
That snippet would then look like so:
Also, you might want to have another look at how Perl treats lists - you needn't touch @line at all.if(/^\%/) { my $tag = shift @line; my $full = join ' ', @line; push @{$outer{$tag}}, $full; }
if(/^\%/) { my $full = join ' ', @line[1 .. $#line]; push @{$outer{$line[0]}}, $full; }
$#array_var is the index of the last element in the @array_var variable.
And now it's pretty obvious we need no extra variable to store the joined string in:
I like to avoid as many nesting blocks wherever possible, so I'd take another step: push @{$outer{$line[0]}}, join ' ', @line[1 .. $#line] if /^\%/;if(/^\%/) { push @{$outer{$line[0]}}, join ' ', @line[1 .. $#line]; }
Makeshifts last the longest.
In reply to Re: push to a hash of arrays
by Aristotle
in thread push to a hash of arrays
by aennen
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |