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:

if(/^\%/) { my $tag = shift @line; my $full = join ' ', @line; push @{$outer{$tag}}, $full; }
Also, you might want to have another look at how Perl treats lists - you needn't touch @line at all.
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:

if(/^\%/) { push @{$outer{$line[0]}}, join ' ', @line[1 .. $#line]; }
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 /^\%/;

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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.