in reply to Re^2: Newbies question: initializing data structure
in thread Newbies question: initializing data structure

specifically, I noticed my @arr = {map { }, 1 .. $arr_len} seems to work, rather than my first guess, which was my @arr = [map { }, 1 .. $arr_len].

But shouldn't we return a array to assign into @arr? hence use square brackets?

Replies are listed 'Best First'.
Re^4: Newbies question: initializing data structure
by almut (Canon) on Jun 02, 2010 at 11:18 UTC

    [ ] and { } return an array and a hash reference respectively, i.e. a scalar. That scalar is assigned to the first element of @arr.  If you want to fill the array with the elements created by map, you probably just want

    my @arr = map { }, 1 .. $arr_len;

    or maybe

    my $arrayref = [ map { }, 1 .. $arr_len ];

    As to the former variant, you can also put parentheses around the list (to make it clear it is a list)

    my @arr = ( map { }, 1 .. $arr_len );

    but syntactically they're not required in this case.


    P.S.: with {map { }, 1..$arr_len} you'd run into problems with an odd-number $arr_len, because hashes need to be initialized from key/value pairs... But using anonymous hashes ({}) as hash keys only is of limited use anyway (they'd end up stringified like 'HASH(0x63aa80)') — and probably not what you meant.