I'm new to Perl. I understand that my @a = (); is equivalent to my @a;-- both initialize an empty array. Similarly, my $a = []; initializes an empty array that's referenced by $a.
However, I'm perplexed by my @arr = []; which is also legal Perl. According to ref() and print, @arr is an array, not a reference to one. It can be pushed onto, which seems to return the number of elements in the array. But it seems to contain a reference to another array, which can also be pushed onto:
#!/usr/bin/perl
use v5.16;
my @arr = [];
push(@arr, 1);
print join(", ", @arr) . "\n";
push(@arr[0], 11);
push(@arr[0], 12);
print "a[0]: " . join(", ", @{@arr[0]}) . "\n";
Outputs
ARRAY(0xd6ede8), 1
a[0]: 11, 12
What is going on here? Detail is greatly appreciated.
use strictanduse warningsat the start of every Perl program. In this case the latter would have warned youScalar value @arr[0] better written as $arr[0]. In later versions of Perl it is valid to push to array references, and the first element of@arris a reference. To access the array explicitly you would write@{ $arr[0] }.[ ... ]is roughly equivalent todo { my @anon = ( ... ); \@anon }. It returns a reference, and references are scalars, and thus legitimate values for array elements.