Is it possible to push
to an array reference in Perl? Googling has suggested I deference the array first, but this doesn\'t really work. It pushes to the defere
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.
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.
Yes its possible. This works for me.
my @a = ();
my $aref = \@a; # creates a reference to the array a
push(@$aref, "somevalue"); # dereference $aref and push somevalue in it
print $a[0]; # print the just pushed value, again @$aref[0] should also work
As has been mentioned, $aref = [@a]
will copy and not create reference to a
$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.