¿Qué hace shift() en Perl?
built-in (6)
¿Qué podría significar posiblemente la siguiente línea?
my $x = shift;
En Perl, muchos métodos usan las variables predeterminadas ( $_
y @_
) si no especifica explícitamente los argumentos. Tu código es idéntico a:
my $x = shift @_;
Como señaló PullMonkey anteriormente, dentro de una subrutina, @_
contiene los argumentos pasados a esa subrutina (como se describe en perlsub
). shift
eliminará el primer valor de argumento de @_
y lo almacenará en $x
, por lo que $_[0]
ahora le dará el segundo argumento pasado a su subrutina.
Esta suele ser una expresión idiomática para: $ x es una variable local asignada al primer parámetro que se pasa a la subrutina, aunque.
my ($x) = @_;
es probablemente más claro (y no modifica la lista de argumentos).
La función de shift
elimina el primer elemento de una matriz y lo devuelve. La matriz se acorta en un elemento.
La matriz predeterminada (si no se proporciona un parámetro) es @_
si está en una función, o @ARGV
si se encuentra en el alcance del archivo.
Entonces, en este caso, $x
se está configurando para el primer parámetro de función o para el primer parámetro de línea de comando.
Si está en una subrutina, esta línea shift
en @_
(los parámetros que se pasan).
Entonces, $x
sería el primer elemento extraído de la matriz @_
.
Por lo general, vería $x = shift if @_;
en el lenguaje de un lego, desde una vista de muy alto nivel, shift toma el primer elemento de una matriz (la parte más a la izquierda), mientras que lo opuesto es pop que toma el último elemento de la matriz (la parte más a la derecha).
my @array1=(5,6,7,8,9); my $x = shift @array1; print "$x/n"; # 5 print "@array1/n"; # 6 7 8 9
shift()
es una subrutina Perl incorporada que toma una matriz como argumento, luego regresa y borra el primer elemento en esa matriz. Es una práctica común obtener todos los parámetros pasados a una subrutina con llamadas de shift
. Por ejemplo, supongamos que tiene una subrutina foo
que toma tres argumentos. Una forma de obtener estos parámetros asignados a las variables locales es con el shift
así:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
La confusión aquí es que parece que shift no se está pasando una matriz como argumento. De hecho, se está pasando la matriz "predeterminada" implícitamente, que es @_
dentro de una subrutina o @ARGV
fuera de una subrutina.