in reply to Array of Arrays: why is "$VAR1->[0][1]" and the like embedded within?

The parameter passed to the second call to "increment" is the AOA consisting of the tuples resulting from the first call.

Since your code that creates @a basically references elements of existing tuples (which now are references), perl does not create NEW references .. it uses existing addresses of these items.

This is what Dumper tries to show you - some elements reference things inside yourself!

The actual values generated are indeed proper tuples the way you expect .. they just happen to be references to existing stuff.

FYI - the "increment" sub could be condensed to a single statement:

return [ map {[$d->[$_-1],$d->[$_]]} 1..$#$d ];

                Memory fault   --   brain fried

  • Comment on Re: Array of Arrays: why is "$VAR1->[0][1]" and the like embedded within?
  • Download Code

Replies are listed 'Best First'.
Re^2: Array of Arrays: why is "$VAR1->[0][1]" and the like embedded within?
by Athanasius (Archbishop) on Jun 11, 2018 at 04:15 UTC

    ++NetWallah.

    corenth: You can visualise what NetWallah said by writing your own display loop:

    use strict; use warnings; use Data::Dumper; my @a = (1, 2, 3, 4, 6); my $y = increment(increment(\@a)); for my $j (@$y) { print "[\n"; for my $k (@$j) { print " $k: @$k\n"; } print "]\n"; } sub increment ...

    Output:

    14:12 >perl 1896_SoPW.pl [ ARRAY(0x1db5610): 1 2 ARRAY(0x1d284d8): 2 3 ] [ ARRAY(0x1d284d8): 2 3 ARRAY(0x1d28640): 3 4 ] [ ARRAY(0x1d28640): 3 4 ARRAY(0x1d28a00): 4 6 ] 14:12 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      or .. it may be easier to dump the elements of the output:
      print Dumper $_ for @{ increment(increment(\@a)) }; # Output: [ [ 1, 2 ], [ 2, 3 ] ] [ [ 2, 3 ], [ 3, 4 ] ] [ [ 3, 4 ], [ 4, 6 ] ]

                      Memory fault   --   brain fried

        Sure, that gives a better view of the contents of the data structure. But it doesn’t show that the second occurrence of the anonymous array [ 2, 3 ] has the same address as (= is the same anonymous array as) the first — which is what I was intending to demonstrate.

        Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      I kind of get it, but it's still hard for me to visualize. I'm going to play with this along with everyone's code on this thread. It's a must that I get my head around it.
      $state{tired}?sleep(40):eat($food);
Re^2: Array of Arrays: why is "$VAR1->[0][1]" and the like embedded within?
by corenth (Monk) on Jun 11, 2018 at 15:22 UTC
    Ah. My thoughts went that way, but I had a hard time visualizing the issue. I'll be thinking on it a bit.
    $state{tired}?sleep(40):eat($food);