Что () выполняет в определении подпрограммы в Perl? - PullRequest
4 голосов
/ 26 октября 2010

Следующий код взят непосредственно из источника модуля Tie :: File.Что в этом контексте выполняют пустые скобки в определении O_ACCMODE?Я знаю, для чего используются прототипы подпрограмм, но такое использование, похоже, не имеет к этому отношения.

Ответы [ 3 ]

12 голосов
/ 26 октября 2010

Он также сообщает синтаксическому анализатору, что O_ACCMODE не принимает аргумент ни при каких условиях (кроме &O_ACCMODE(), о котором вам, вероятно, никогда не придется думать).Это заставляет его вести себя так, как будто большинство людей ожидают константу.

В качестве быстрого примера, в:

sub FOO { 1 }
sub BAR { 2 }

print FOO + BAR;

последняя строка разбирается как print FOO(+BAR()), а значение печатается как 1, потому чтокогда сабвуфер без прототипа вызывается без паренов, он пытается действовать как листоп и смещает термины как можно правее.

In:

sub FOO () { 1 }
sub BAR () { 2 }

print FOO + BAR;

Последняя строка анализируется как print FOO() + BAR()и напечатанное значение равно 3, потому что прототип () сообщает синтаксическому анализатору, что никакие аргументы для FOO не являются ожидаемыми или действительными.

11 голосов
/ 26 октября 2010

С perlsub на тему постоянных функций:

Функции с прототипом () потенциальные кандидаты на встраивание

7 голосов
/ 26 октября 2010

Прототип () дает подпрограмме право на вставку.Это используется, например, constant прагмой.

См. Постоянные функции в perlsub.

...