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 @_
.
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% _ ".) –
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. –
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. –