Использование амперсандов и паренов при вызове Perl - PullRequest
14 голосов
/ 15 июля 2011
#!/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.

Ответы [ 3 ]

23 голосов
/ 15 июля 2011

Вызов подпрограммы с использованием синтаксиса &NAME; делает текущий @_ видимым для нее. Это задокументировано в perlsub :

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

Итак, это определенно особенность.

18 голосов
/ 15 июля 2011

При использовании & перед передачей имени и списка аргументов текущий @_ передается в качестве аргумента.Итак, это особенность.

Ниже приведены различные способы вызова подпрограммы:

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

2 голосов
/ 15 июля 2011

Прямо из уст верблюдаПодпрограмма: массив @_ во время вызова вместо этого виден подпрограмме.Это эффективный механизм, которого новые пользователи могут пожелать избегать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...