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

Thanks for your reply. I would like to note that even when a warning is generated when i use @array[0], the output is the same as when i use what perl suggests i.e. $array[0].
So both ways @array[0] vs $array[0] produce the same result but the former generates a warning.

Replies are listed 'Best First'.
Re^3: accessing array elements using a reference
by ikegami (Patriarch) on May 19, 2008 at 05:26 UTC

    @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.

      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.