Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Re: Not an ARRAY reference error

by GrandFather (Saint)
on Mar 28, 2021 at 23:05 UTC ( [id://11130535]=note: print w/replies, xml ) Need Help??


in reply to Not an ARRAY reference error

Try @{$self->{'column'}}. :-)

Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond

Replies are listed 'Best First'.
Re^2: Not an ARRAY reference error
by Bod (Parson) on Mar 28, 2021 at 23:22 UTC

    Thank you :)

    So I wasn't too far out with the (de)referencing...that's a relief!

    Would it be correct that @$self->{'column'} is trying to dereference $self first and then access the column key of the dereferenced value?

      Would it be correct that @$self->{'column'} is trying to dereference $self first ...

      My narrative would be that @$self->{'column'} is trying to dereference $self first as an array reference (it's not; it's a blessed hash reference).

      ... and then access the column key of the dereferenced value?

      Once the attempt to dereference a hash ref. as an array fails, that's it: parsing cannot continue. If parsing went on, it would have to deal with an expression equivalent to
          @some_array->{'column'}
      that makes no Perlish sense. Looked at another way, even if the proper hash reference dereferencing operator (the % sigil) were used, the expression would still make no sense (update: now; see Update below):
          %$self->{'column'}
      is equivalent to
          %some_hash->{'column'}

      Update: Well, actually... It dawned on me that a long time ago, in a Perliverse far, far away, this sort of expression did, briefly, enjoy some validity:

      Win8 Strawberry 5.8.9.5 (32) Mon 03/29/2021 3:40:28 C:\@Work\Perl\monks >perl -Mstrict -Mwarnings -l my %hash = qw(column vertical fence horizontal); print %hash->{'column'}; Using a hash as a reference is deprecated at - line 3. my @array = qw(column fence); print @array->[1]; Using an array as a reference is deprecated at - line 6. my $ar = \@array; print @$ar->[0]; Using an array as a reference is deprecated at - line 9. ^Z vertical fence column
      (Update: Changed 5.8 example to include array reference; hash reference assumed to work similarly.)

      As it was told to me, the history of this syntax is that it began as a bug and was elevated by use into a "feature." As you see, it persisted as late as Perl version 5.8, although even by then it was deprecated. By version 5.30, it was entirely extirpated:

      Win8 Strawberry 5.30.3.1 (64) Mon 03/29/2021 2:54:54 C:\@Work\Perl\monks >perl my %hash = qw(column vertical fence horizontal); print %hash->{'column'}; Can't use a hash as a reference at - line 3. Win8 Strawberry 5.30.3.1 (64) Mon 03/29/2021 2:55:26 C:\@Work\Perl\monks >perl my @array = qw(column fence); print @array->[1]; Can't use an array as a reference at - line 3.

      Of course, something like @$hash_reference has always been verboten.


      Give a man a fish:  <%-{-{-{-<

      A simple test is to try {@$self}->{'column'} and see if that gives the same result (it does).

      I tend to be explicit always in this sort of dereferencing context because I'm never quite sure without thinking about it and I assume most other people working with the code will do the same thing.

      Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11130535]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (3)
As of 2024-04-25 21:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found