2009-01-17 20 views
8

Revisé un código que había escrito en mi clase de Perl y lo noté.¿Qué hace '@_' en Perl?

my ($string) = @_; 
my @stringarray = split(//, $string); 

Me pregunto dos cosas: la primera línea, donde la variable es entre paréntesis, esto es algo que se hace cuando se declara más de una variable y si me las quité todavía trabajaría ¿verdad?

La segunda pregunta sería ¿qué hace el @_?

Respuesta

21

La variable @_ es una matriz que contiene todos los parámetros pasados ​​a una subrutina.

Los paréntesis alrededor de la variable $string son absolutamente necesarios. Ellos designan que está asignando variables de una matriz. Sin ellos, la matriz @_ se asigna a $string en un contexto escalar, lo que significa que $string sería igual al número de parámetros pasados ​​a la subrutina. Por ejemplo:

sub foo { 
    my $bar = @_; 
    print $bar; 
} 

foo('bar'); 

El resultado aquí es 1 - definitivamente no es lo que esperaba en este caso.

Alternativamente, podría asignar la variable $string sin necesidad de utilizar la matriz @_ y utilizar la función shift lugar:

sub foo { 
    my $bar = shift; 
    print $bar; 
} 

usando un método sobre el otro es bastante una cuestión de gusto. Hice esta pregunta which you can check out si está interesado.

5

La variable @_ es una matriz (de ahí el prefijo @) que contiene todos los parámetros de la función actual.

9

Perl tiene dos contextos diferentes, contexto escalar y contexto de lista. Una matriz '@_ ', si se utiliza en contexto escalar devuelve el tamaño de la matriz.

Por lo tanto, dados estos dos ejemplos, el primero le da el tamaño de la matriz @_  , y el otro le da el primer elemento.

my $string = @_ ; 
my ($string) = @_ ; 

Perl tiene tres variables 'default' $_, @_, y dependiendo de a quién le pregunte %_. Muchas operaciones utilizarán estas variables, si no les da una variable para trabajar. La única excepción es que no hay ninguna operación que actualmente use de manera predeterminada %_.

Por ejemplo, tenemos push, pop, shift, y unshift, que todos aceptarán una matriz como el primer parámetro. Si no les da un parámetro, usarán la variable 'predeterminada' en su lugar. Así que 'shift;' es lo mismo que 'shift @_;'

La forma en que se diseñaron las subrutinas, no se podía decir formalmente al compilador qué valores se deseaban en qué variables. Bien, tenía sentido usar la variable de matriz "predeterminada" @_ para contener los argumentos.

Estas tres subrutinas son (casi) idénticas.

sub myjoin{ 
    my ($stringl, $stringr) = @_; 
    return "$stringl$stringr"; 
} 

sub myjoin{ 
    my $stringl = shift; 
    my $stringr = shift; 
    return "$stringl$stringr"; 
} 

sub myjoin{ 
    my $stringl = shift @_; 
    my $stringr = shift @_; 
    return "$stringl$stringr"; 
} 

creo que la primera es ligeramente más rápido que los otros dos, porque no se está modificando la variable @_.

+0

Buena respuesta. No obstante, no creo que% _ se use alguna vez en Perl. (Es decir, nunca se asume y no es una variable especial de ningún otro tipo. El usuario puede usarlo, por supuesto, pero ni siquiera guardará las teclas al escribir, por ejemplo, "claves" en lugar de "claves% _ ".) –

+0

No creo haber encontrado ninguna característica integrada de Perl que use% _, de forma predeterminada, pero todavía se considera como una de las variables predeterminadas. O al menos creo que recuerdo haber leído eso en alguna parte. –

+0

No hay ninguna palabra sobre% _ en perlvar. No lo he visto en ningún lugar durante mis muchos años de práctica profesional en Perl. –

11

Cuando encuentre una variable especial (o de puntuación) en Perl, consulte the perlvar documentation. Los enumera a todos, le da un equivalente English y le dice lo que hace.