Использование амперсандов и парнеров при вызове подпрограммы Perl
#!/usr/bin/perl
sub t {
print "in t\n";
print "@_\n";
&s;
}
sub s {
print "in s\n";
print "@_\n";
}
t(1,2);
print "out\n";
print "@_\n";
Вывод:
in t
1 2
in s
1 2
out
Как вы видите, &s
вывод 1 2
, когда параметр не передан. Является ли это признаком или ошибкой?
Протестированная версия - 5.8.8.
Ответы
Ответ 1
Вызов подпрограммы с использованием синтаксиса &NAME;
делает текущим @_
видимым. Это описано в perlsub:
Если подпрограмма вызывается с использованием формы &
, список аргументов является необязательным, и если опустить, для подпрограммы не устанавливается массив @_
: массив @_
во время вызова виден вместо подпрограммы. Это механизм эффективности, которого могут пожелать новые пользователи.
Итак, это определенно особенность.
Ответ 2
При использовании &
перед тем, как передается имя субменю и список аргументов, текущий @_
передается вместо аргумента. Таким образом, это особенность.
Вот несколько способов вызова подпрограммы:
NAME(LIST); # & is optional with parentheses.
NAME LIST; # Parentheses optional if predeclared/imported.
&NAME(LIST); # Circumvent prototypes.
&NAME; # Makes current @_ visible to called subroutine.
из perldoc perlsub
Ответ 3
Прямо от верблюжьего рта:
Если подпрограмма вызывается с использованием формы `` & '', список аргументов является необязательным, и если он опущен, для подпрограммы не создается массив @_: массив @_ во время вызова вместо этого видна подпрограмма. Это механизм эффективности, которого могут пожелать новые пользователи.