Push to array reference Push to array reference arrays arrays

Push to array reference


It might help to think in terms of memory addresses instead of variable names.

my @a = ();       # Set aside memory address 123 for a list.my $a_ref = [@a]; # Square brackets set aside memory address 456.                  # @a COPIES the stuff from address 123 to 456.push(@$a_ref,"hello"); # Push a string into address 456.print $a[0]; # Print address 123.

The string went into a different memory location.

Instead, point the $a_ref variable to the memory location of list @a. push affects memory location 123. Since @a also refers to memory location 123, its value also changes.

my $a_ref = \@a;       # Point $a_ref to address 123. push(@$a_ref,"hello"); # Push a string into address 123.print $a[0];           # Print address 123.


You can push directly onto an array ref without deferencing.

my $arrayRef = [];push $arrayRef, "one";push $arrayRef, "two";print @$arrayRef;

Outputs

onetwo

Documentation: http://perldoc.perl.org/functions/push.html

Starting with Perl 5.14, push can take a scalar EXPR, which must hold a reference to an unblessed array.

Pre 5.14 you must dereference the array ref first.

push @$arrayRef, "item";

Edit: Annnnd pushing directly to array ref has been deprecated in a recent perl release (5.24?). Given this, it would be safer to always dereference @{$arrayRef} before pushing to increase the compatibility of your code.


$a is not $a_ref, ($a is the first comparison variable given to a sort{}, and $a[0] is the 0th element of the @a array).Never use $a, or $b outside of a custom sort subroutine, and the @a and @b array should probably be avoided to too (there are plenty of better choices)...

What you're doing is assigning to $a_ref, an anonymous array, and then pushing onto it "hello", but printing out the first element of the @a array.