Использование амперсандов и парнеров при вызове подпрограммы 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

Прямо от верблюжьего рта:

Если подпрограмма вызывается с использованием формы `` & '', список аргументов является необязательным, и если он опущен, для подпрограммы не создается массив @_: массив @_ во время вызова вместо этого видна подпрограмма. Это механизм эффективности, которого могут пожелать новые пользователи.