Можно ли создать прототип подпрограммы как $$ & в perl? - PullRequest
2 голосов
/ 03 декабря 2011

Просто любопытство, я немного поиграл с прототипированием, но кажется, что прототип & для подпрограммы разрешен только в первой позиции.

Когда я пишу

sub test (&$$) {
    do_something;
}

и назовите его

test {doing_something_else} 1,2;

. Это работает.

Когда я создаю такой прототип, как

sub test ($$&) {
    do_something;
}

и снова называю его

test 1,2 {doing_something_else};

это не работает.Я пытался с различными перестановками, но, кажется, ничего не доставляет.

Я что-то упустил, или это невозможно?И если нет, то почему?

(мне, возможно, нужно указать, что я успешно попробовал вариант вызова test (1, 2, sub {foo}), конечно, но это выглядит не совсем таксексуальный как вариант в последнем примере выше (и для этого мне даже не нужно создавать прототипы), я хотел бы иметь возможность реализовать синтаксис структур, таких как if () {} else {} и т. д., или, болееточка, try () catch () {} или switch () case () {}, но я думаю, поэтому эти конструкции еще не реализованы в Perl)

Ответы [ 2 ]

8 голосов
/ 03 декабря 2011

Символ-прототип & принимает форму блока только тогда, когда это первый элемент в прототипе.Это лишь ограничение работы парсера прототипов perl.

Вы всегда можете использовать ключевое слово sub для создания анонимной подпрограммы, которая прекрасно работает в качестве аргумента в любой позиции без прототипа.

test 1, 2, sub {doing_something_else};

Если вы действительно хотите написать это без sub, но не на первой позиции, вы можете весело поиграть с Devel :: Declare, чтобы написать свои собственные правила синтаксического анализа для тестовой подпрограммы (эторасширенная тема).

7 голосов
/ 03 декабря 2011

Цитирование документации (perldoc perlsub):

"&" требует анонимную подпрограмму, которая, если передана как first аргумент, не требует ключевого слова "sub" или последующей запятой.

...