2008-11-17 19 views
64

¿Qué podría significar la siguiente línea?¿Qué hace shift() en Perl?

my $x = shift; 
+32

No importa si lo buscó en Google o no.Es una gran pregunta y definitivamente debe formar parte de la base de datos de Stack Overflow. – cowgod

+6

@friedo - ¡De acuerdo, 100%! Esto no debería convertirse en un sitio de "léame los documentos a mí". –

+0

'perldoc -f shift' contiene información útil de" perlfunc ". Ver [perfun] (http://perldoc.perl.org/perlfunc.html), o incluso [perlfun: shift()] (http://perldoc.perl.org/functions/shift.html). Ninguna de las respuestas hace un buen trabajo al vincular/extraer de la documentación. Entonces, "RTFM" o no, se debe incluir una referencia. –

Respuesta

2

Esto es por lo general un modismo para: $ x es una variable local asignado al primer parámetro pasado a la subrutina, aunque.

my ($x) = @_; 

es probablemente más claro (y no modifica la lista de argumentos).

14

La función 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 uno como parámetro) es @_ si está en una función, o @ARGV si se encuentra en el alcance del archivo.

En este caso, $x se está configurando en el primer parámetro de función o en el primer parámetro de línea de comando.

+7

Se debe agregar que @_ es la matriz que contiene los parámetros dados a una función, y @ARGV es la matriz que contiene los parámetros dados a un programa. – Svante

0

Si se encuentra en una subrutina, esta línea será shift en @_ (los parámetros que se pasan).
Así que $x sería el primer elemento popped de la matriz @_.

Así que por lo general se vería $x = shift if @_;

+2

No es necesario para el if. "mi $ x = cambio"; y "my $ x; $ x = shift if @_;" son equivalentes y ambos darán como resultado que $ x no sea undef si @_ está vacío, ni violarán estrictamente ni emitirán una advertencia. La única diferencia es la cantidad de tipeo que tienes que hacer. –

52

shift() una construida en Perl subrutina que toma una matriz como argumento, entonces vuelve y elimina el primer elemento de la matriz. Es una práctica común obtener todos los parámetros pasados ​​a una subrutina con llamadas 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 shift así:

sub foo() { 
    my $x = shift; 
    my $y = shift; 
    my $z = shift; 
    # do something 
} 

La confusión aquí es que parece cambio no se está pasando una matriz como un argumento. De hecho, se está pasando la matriz "predeterminada" implícitamente, que es @_ dentro de una subrutina o @ARGV fuera de una subrutina.

+0

o @ARGV, si no está en una función (ver mi respuesta) – Alnitak

+1

no desea el '()' después del nombre del subtítulo - debe ser 'sub foo {...'. Con el '()' estás diciendo que foo no acepta argumentos, que no es lo que quieres en este caso – EvdB

+3

Prefiero usar 'sub foo {my ($ x, $ y, $ z) = @_}' mismo es menos repetitivo –

6

En Perl, muchos métodos usan las variables predeterminadas ($_ y @_) si no especifica explícitamente los argumentos. Su código es idéntica a:

my $x = shift @_; 

como señaló PullMonkey anteriormente, dentro de una subrutina, @_ contiene los argumentos que se pasan a la 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.

0

en el lenguaje de un laico, desde un punto de vista muy alto nivel, cambio está tomando el primer elemento de una matriz (la parte más a la izquierda), mientras que lo contrario es pop que está teniendo el último elemento de la matriz (la más a la derecha parte).

 
my @array1=(5,6,7,8,9); 
my $x = shift @array1; 
print "$x\n"; # 5 
print "@array1\n"; # 6 7 8 9