Perl имеет два разных контекста, скалярный контекст и контекст списка. Массив '@_
', если он используется в скалярном контексте, возвращает размер массива.
Итак, учитывая эти два примера, первый дает вам размер массива @_
, а другой - первый элемент.
my $string = @_ ;
my ($string) = @_ ;
<Ч />
В Perl есть три переменные по умолчанию $_
, @_
и в зависимости от того, кого вы спрашиваете %_
. Многие операции будут использовать эти переменные, если вы не дадите им переменную для работы. Единственное исключение - нет операции, которая в настоящее время по умолчанию будет использовать %_
.
Например, у нас есть push
, pop
, shift
и unshift
, которые все примут массив в качестве первого параметра.
Если вы не дадите им параметр, они будут использовать вместо него переменную по умолчанию. Таким образом, «shift;
» совпадает с «shift @_;
»
То, как были спроектированы подпрограммы, вы не могли формально сказать компилятору, какие значения вы хотите в каких переменных. Что ж, имело смысл использовать переменную массива по умолчанию @_
для хранения аргументов.
Итак, эти три подпрограммы (почти) идентичны.
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";
}
Я думаю, что первый немного быстрее двух других, потому что вы не изменяете переменную @_
.