почему синтаксис `& name arg1 arg2` нельзя использовать для вызова подпрограммы Perl?

для подпрограммы Perl, если передать аргумент 0, я могу использовать 4 формы для ее вызова. Но при передаче 1 или более аргументов есть одна форма, которую я не могу использовать, см. Ниже:

sub name
{
    print "hello\n";
}
# 4 forms to call
name;
&name;
name();
&name();

sub aname
{
        print "@_\n";
}
aname "arg1", "arg2";
#&aname "arg1", "arg2"; # syntax error
aname("arg1", "arg2");
&aname("arg1", "arg2");

Вывод ошибки:

String found where operator expected at tmp1.pl line 16, near "&aname "arg1""
    (Missing operator before  "arg1"?)
syntax error at tmp1.pl line 16, near "&aname "arg1""
Execution of tmp1.pl aborted due to compilation errors.

Может ли кто-нибудь объяснить вывод ошибок с точки зрения компилятора? Не понимаю, почему он жалуется на отсутствие оператора.

Спасибо


person password636    schedule 21.09.2016    source источник
comment
У тебя отличный ответ. Для более подробного обсуждения использования & для этого см. this post и this post и this post ... и, вероятно, есть и другие.   -  person zdim    schedule 21.09.2016
comment
@zdim просто интересно, а зачем ты разместил ссылки в разметке кода?   -  person simbabque    schedule 21.09.2016
comment
@simbabque Ха, хорошее замечание. Полагаю, чтобы они были более заметными, выделенными. На самом деле не знаю. Никогда не думал об этом как о разметке кода (вы правы, это так) - но скорее о выделении.   -  person zdim    schedule 21.09.2016


Ответы (1)


Это задокументировано в perlsub:

Для вызова подпрограмм:

       NAME(LIST);    # & is optional with parentheses.
       NAME LIST;     # Parentheses optional if predeclared/imported.
       &NAME(LIST);   # Circumvent prototypes.
       &NAME;         # Makes current @_ visible to called subroutine.

С &NAME "arg" perl видит &NAME() "ARG", поэтому он думает, что между подвызовом и «ARG» отсутствует оператор.

В Perl 5 в большинстве случаев & не требуется.

person choroba    schedule 21.09.2016