¿Cuál es el significado de @_
en Perl?
perldoc perlvar es el primer lugar para verificar cualquier información de variable Perl con nombre especial.
Citando:
@_
: Dentro de una subrutina, la matriz@_
contiene los parámetros pasados a esa subrutina.
Se pueden encontrar más detalles en perldoc perlsub (subrutinas de Perl) enlazadas desde perlvar:
Todos los argumentos pasados aparecen en la matriz
@_
.Por lo tanto, si llama a una función con dos argumentos, estos se almacenarán en
$_[0]
y$_[1]
.La matriz
@_
es una matriz local , pero sus elementos son alias de los parámetros escalares reales . En particular, si se actualiza un elemento $ _ [0], se actualiza el argumento correspondiente (o se produce un error si no es actualizable).Si un argumento es una matriz o un elemento hash que no existía cuando se llamó a la función, ese elemento se crea solo cuando (y si) se modifica o se toma una referencia a él. (Algunas versiones anteriores de Perl creaban el elemento independientemente de si el elemento estaba asignado o no). La asignación a toda la matriz @_ elimina ese alias y no actualiza ningún argumento.
Por lo general, expande los parámetros pasados a un sub usando la
@_
variable:sub test{ my ($a, $b, $c) = @_; ... } # call the test sub with the parameters test('alice', 'bob', 'charlie');
Esa es la forma que afirma Perlcritic como correcta .
fuente
perlcritic
, personalmente creo que esto es mejor para una función, pero para un método, es útil parashift
la autorreferencia, luego descomprime la@_
matriz. Esto deja en claro que este es un método Y que el método toma ciertos parámetrosEl primer resultado de una búsqueda
perl @_
dice esto :También tiene una explicación más larga y detallada del mismo.
fuente
La pregunta era qué
@_
significa en Perl. La respuesta a esa pregunta es que, en la medida en$_
medios que en Perl,@_
significa igualmente que .Nadie parece haber mencionado este aspecto crítico de su significado, así como el de ellos .
En consecuencia, ambos se usan como pronombres o, a veces, como topicalizadores.
Suelen tener antecedentes nominales, aunque no siempre.
fuente
También puede usar shift para variables individuales en la mayoría de los casos:
$var1 = shift;
Este es un tema en el que debería investigar más, ya que Perl tiene varias formas interesantes de acceder a información externa dentro de su subrutina.
fuente
Todas las "variables especiales" de Perl se enumeran en la página de documentación de perlvar .
fuente
Además, si una función devuelve una matriz, pero la función se llama sin asignar sus datos devueltos a ninguna variable como a continuación. Aquí se llama split (), pero no se asigna a ninguna variable. Podemos acceder a sus datos devueltos más tarde a través de @_:
$str = "Mr.Bond|Chewbaaka|Spider-Man"; split(/\|/, $str); print @_[0]; # 'Mr.Bond'
Esto dividirá la cadena
$str
y establecerá la matriz@_
.fuente
@
se utiliza para una matriz.En una subrutina o cuando llama a una función en Perl, puede pasar la lista de parámetros. En ese caso,
@_
se puede usar para pasar la lista de parámetros a la función:sub Average{ # Get total number of arguments passed. $n = scalar(@_); $sum = 0; foreach $item (@_){ # foreach is like for loop... It will access every # array element by an iterator $sum += $item; } $average = $sum / $n; print "Average for the given numbers: $average\n"; }
Llamada de función
Average(10, 20, 30);
Si observa el código anterior, vea la
foreach $item(@_)
línea ... Aquí pasa el parámetro de entrada.fuente
use strict
. Por lo tanto, edité su función secundaria.¡Nunca intente editar a la variable @_! No deben tocarse ... O obtendrás algún efecto insospechado. Por ejemplo...
my $size=1234; sub sub1{ $_[0]=500; } sub1 $size;
Antes de llamar a sub1 $, el tamaño contiene 1234. Pero después de 500 (!!) ¡¡¡Así que no edite este valor !!! Puede pasar dos o más valores y cambiarlos en una subrutina y ¡todos se cambiarán! Nunca he visto este efecto descrito. Los programas que he visto también dejan @_ array readonly. Y solo que puede pasar de manera segura la variable no cambia la subrutina interna Siempre debe hacer eso:
sub sub2{ my @m=@_; .... }
asigne @_ a las variables de procedimiento de subrutina local y luego trabajó con ellas. También en algunos algoritmos recursivos profundos que devuelven una matriz, puede usar este enfoque para reducir la memoria utilizada para las variables locales. Solo si devuelve @_ array igual.
fuente