perl - secundaria - matriz de referencia castellano 5
Empujar a la matriz de referencia (4)
Puede presionar directamente sobre una matriz de referencia sin desmarcar.
my $arrayRef = [];
push $arrayRef, "one";
push $arrayRef, "two";
print @$arrayRef;
Salidas
onetwo
Documentación: http://perldoc.perl.org/functions/push.html
Comenzando con Perl 5.14, push puede tomar un EXPR escalar, que debe contener una referencia a una matriz no bendecida.
Pre 5.14 debe desreferenciar la matriz ref primero.
push @$arrayRef, "item";
Editar: Annnnd empujar directamente a la matriz de referencia ha quedado obsoleto en una versión reciente de Perl (5.24?). Teniendo esto en cuenta, sería más seguro eliminar siempre @ {$ arrayRef} antes de presionar para aumentar la compatibilidad de tu código.
¿Es posible push
a una referencia de matriz en Perl? Google ha sugerido que deferencia la matriz primero, pero esto realmente no funciona. Empuja a la matriz de referencia, no a la matriz a la que se hace referencia.
Por ejemplo,
my @a = ();
my $a_ref = [@a];
push(@$a_ref,"hello");
print $a[0];
@a
no se actualizará y este código fallará porque la matriz todavía está vacía
(Todavía estoy aprendiendo referencias de Perl, por lo que esta podría ser una pregunta increíblemente simple. Lo siento si es así)
Puede ser útil pensar en términos de direcciones de memoria en lugar de nombres variables.
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.
La cadena entró en una ubicación de memoria diferente.
En su lugar, apunte la variable $a_ref
a la ubicación de la memoria de la lista @a
. push
afecta la ubicación de la memoria 123. Como @a
también se refiere a la ubicación de la memoria 123, su valor también cambia.
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.
Si es posible. Esto funciona para mí
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
Como se ha mencionado, $aref = [@a]
copiará y no creará referencia a un
$a
no es $a_ref
, ( $a
es la primera variable de comparación dada a sort{}
, y $a[0]
es el 0 ° elemento de la matriz @a
). Nunca use $a
, o $b
fuera de una subrutina de ordenación personalizada, y la matriz @a
y @b
probablemente también deba evitarse (hay muchas mejores opciones) ...
Lo que está haciendo es asignarle a $a_ref
, una matriz anónima, y ​​presionarlo "hello"
, pero imprimiendo el primer elemento de la matriz @a
.