in reply to Re^3: accessing array elements using a reference
in thread accessing array elements using a reference

Thanks for the tip. But I still don't understand why
print @{@{$hash{"one"}}[0]}, "\n";
does not generate a warning instructing me to use
print @{${$hash{"one"}}[0]}, "\n";
while
my @array = (4,5,6); print @array[0];
generates a warning instructing me to use $array[0].
Anyone? Thanks a lot in advance

Replies are listed 'Best First'.
Re^5: accessing array elements using a reference
by BrowserUk (Patriarch) on May 19, 2008 at 06:21 UTC

    For the same reason that this also issues the warning:

    @array = qw[ foo bar qux ];; print @{ array }[ 0 ];; Scalar value @{ array }[ 0 ] better written as ${ array }[ 0 ] at foo

    But these do not:

    $name = 'array';; print @{ $name }[ 0 ];; foo $ref = \@array;; print @{ $ref }[ 0 ];; foo

    As this scrunched up deparse output shows, the extra level of indirection means that the code goes through a different path, and the warning has never been attached to that other path:

    9 <;> nextstate(...)v ->a 9 <;> nextstate(...) v ->a g <@> print vK ->h g <@> print vK ->h a <0> pushmark s ->b a <0> pushmark s ->b f <@> aslice lK ->g f <@> aslice lK ->g b <0> pushmark s ->c b <0> pushmark s ->c c <$> const[IV 0] s ->d c <$> const[IV 0] s ->d e <1> rv2av[t5] sKR/1 ->f e <1> rv2av[t4] sKR/1 ->f d <#> gv[*array] s ->e - <@> scope sK ->e -e syntax OK - <0> ex-nextstate v ->d d <$> const[PV "array"] s ->e -e syntax OK

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.