2010-12-30 27 views

Respuesta

97

perldoc perlvar es el primer lugar para buscar información especial de Perl variable.

Citando:

@_: Dentro de una subrutina la matriz @_ contiene los parámetros pasados ​​a la subrutina.

Más detalles se pueden encontrar en perldoc perlsub (Perl subroutines) vinculado desde el perlvar:

Cualquier argumento pasado en aparecer en la array @_. Por lo tanto, si llamó a una función con dos argumentos, esos se almacenarán en $_[0] y $_[1].

La matriz @_ es una array local, pero sus elementos son alias para 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 se puede actualizar ).

Si un argumento es un elemento de matriz o de hash que no existía cuando la función se llama, que se crea elemento sólo cuando (y si) que se modifica o una referencia a él es tomada. (Algunas versiones anteriores de Perl creaban el elemento independientemente de si el elemento estaba asignado). Asignando a toda la matriz @_ elimina ese aliasing , y no actualiza ningún argumento .

+0

Gracias, solo recientemente me he acostumbrado a comprobar perldoc, y he encontrado que las páginas web son útiles: http://perldoc.perl.org/perlvar.html No estuvo mal crear un tallo de perl que lo inicie la web ... el formato de una página web me ayuda mucho. – aschultz

8

primer éxito de un search for perl @_ dice this:

@_ es la lista de parámetros de entrada a un sub.

También tiene una explicación más larga y más detallada de la misma.

+0

En realidad, el primer hit de su búsqueda de Google ahora tiene enlaces a esta página. –

+0

... siete * años * después, una eternidad en el tiempo de Internet. Es por eso que ambos me vinculé al primer resultado y puse en cuartel la parte relevante: dependiendo de Google solo sería muy ingenuo. – Piskvor

+0

cierto que es muchos años después, pero sigue siendo molesto leer la respuesta que implica que debe buscar una respuesta a la pregunta de Google. Es información sin sentido para alguien que lee la respuesta como resultado de Google. –

5

Todas las "variables especiales" de Perl se enumeran en la página de documentación perlvar.

20

Por lo general, a ampliar los parámetros pasados ​​a un sub utilizando la variable @_:

sub test{ 
    my ($a, $b, $c) = @_; 
    ... 
} 

# call the test sub with the parameters 
test('alice', 'bob', 'charlie'); 

Esa es la manera afirma que es correcto por perlcritic.

+0

esta es una vez que no estoy de acuerdo con 'perlcritic', personalmente creo que esto es mejor para una función, pero para un método, es útil 'cambiar' la referencia automática, luego descomprimir la matriz' @ _'. Esto deja en claro que este es un método Y que el método toma ciertos parámetros –

+0

que probablemente debería haber usado/conocido sobre PERLCritic antes, pero no lo hice. Gracias por usarlo en este ejemplo. A veces, las cosas que hace referencia de forma directa pueden ayudar a alguien a aprender algo completamente nuevo para ellos. – aschultz

5

También puede utilizar el cambio de variables individuales en la mayoría de los casos:

$var1 = shift; 

Este es un tema en el que usted debe investigar aún más como Perl tiene un número de maneras interesantes de acceder a la información fuera dentro de su rutina sub.

+3

Genial, quien me dio un voto negativo simplemente por publicar otra manera de hacer algo similar. Me doy cuenta de que no contesté la pregunta directamente porque alguien ya lo hizo, pero ofrecí una forma alternativa a la que a menudo los nuevos programadores de perl se confunden. – hockfan86

7

La pregunta era @_significa en Perl. La respuesta a esa pregunta es que, en la medida en que $_ significa es en Perl, @_ de manera similar significa ellos.

Nadie parece haber mencionado este aspecto crítico de su significado -, así como la suya .

En consecuencia, se usan tanto como pronombres, como a veces como agentes tópicos.

Suelen tener antecedentes nominales, aunque no siempre.

1

También si una función devuelve una matriz, pero se llama a la función sin asignar sus datos devueltos a ninguna de las variables siguientes. Aquí se invoca split(), pero no se asigna a ninguna variable. Podemos acceder a sus datos devueltos posteriormente 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 @_.

1

@ 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, @_ es se puede utilizar para pasar la lista de parámetros de 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 Función

Average(10, 20, 30); 

Si se observa el código anterior, ver la línea foreach $item(@_) ... Aquí pasa el parámetro de entrada.

+0

Siempre debe 'usar strict'. Edité tu sub función por lo tanto. – EverythingRightPlace

0

Nunca intente editar a @_ variable !!!! No se deben tocar. O se obtiene un efecto insospechado. Por ejemplo ...

my $size=1234; 
sub sub1{ 
    $_[0]=500; 
} 
sub1 $size; 

Antes, exija SUB1 $ contiene 1234. Pero después de 500 (!!) por lo que ni editar este valor !!! ¡Puede pasar dos o más valores y cambiarlos en subrutina y todos serán cambiados! Nunca he visto describir este efecto. Los programas que he visto también dejan @_ array de solo lectura. Y sólo el que puede pasar con seguridad a la variable no cambió subrutina interna Siempre hay que hacer eso:

sub sub2{ 
    my @[email protected]_; 
    .... 
} 

asignar @_ a variables de procedimiento subrutina local y próxima trabajado con ellos. También en algunos algoritmos recursivos profundos que vuelven la matriz, puede utilizar este enfoque para reducir la memoria utilizada para los vars locales. Solo si devuelve @_ array del mismo modo.

Cuestiones relacionadas