perl built-in

¿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.