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

@array[0] and $array[0] are very similar. In fact, in scalar context, they evaluate to the same thing. warnings aside, there are two differences between slices and indexed elements. First, the index expression for the slice is evaluated in list context while the index expression for the element is evaluated in scalar context. Second, the slice creates a list context when used as an lvalue while the element creates a scalar context.

Replies are listed 'Best First'.
Re^4: accessing array elements using a reference
by Anonymous Monk on May 19, 2008 at 05:42 UTC
    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

      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.