I did suspected it would have something to do with the difference between
array and list contexts.
Your analysis seems to be correct.

Thank you for solving this puzzle :)

Regards

On 5/31/07, Chas Owens <[EMAIL PROTECTED]> wrote:

On 5/31/07, David Unric <[EMAIL PROTECTED]> wrote:
> Based on perlref documentation arrow operator between brackets
subscripts
> may be omitted so the following code is valid:
>
> @array = ( [1, 2], [3, 4] );
> $element = $array[0][0];    #  shorthand for  $element = $array[0]->[0]
>
>
> Could somebody explain why it causes syntax error when the above rule is
> applied to returned value of a subroutine ?
>
> sub mysub {
>     @array = ( [1, 2], [3, 4] );
>
>     return @array;
> }
>
> $element = (&mysub)[0][0];   # $elem = (&mysub)[0]->[0] is valid
> ------------------------------
> syntax error at testarr.pl line 7, near "]["
>

My best guess is that the problem here is that (mysub())* is a list
not an array.  Lists are not multidimensional.  Try

my $element = ([1, 2], [3, 4])[0][0];

Notice how it gets the same error?

The simple solution is to use the arrow, or have the sub return an
arrayref.  Here are some ways to do it:

#!/usr/bin/perl

use strict;
use warnings;

sub list {
        my @array = ( [1, 2], [3, 4] );
        return @array;
}

sub aref {
        my @array = ( [1, 2], [3, 4] );
        return [EMAIL PROTECTED];
}

print (
        (list())[0]->[0], "\n",
        "${[list()]}[0][1]\n",
        "${aref()}[1][0]\n",
        (aref())->[1][1], "\n"
);



* don't use &mysub unless you know why you are doing it, use mysub()
instead

Reply via email to