Почему я не могу опустить () здесь? - PullRequest
6 голосов
/ 29 июня 2011
SaveImages @img_sources;

Выше будет сообщаться:

Array found where operator expected 

Почему я не могу опустить () здесь?

Ответы [ 5 ]

13 голосов
/ 29 июня 2011

потому что ваша подпрограмма SaveImages объявляется после вызова.Скобки не нужны, если подпрограмма объявлена ​​перед вызовом.

пример:

use strict;
use warnings;
use Data::Dumper;
my @ar = (1, 2);
fn @ar;
sub fn
{
    print Dumper \@_;
}

не работает, а

use strict;
use warnings;
use Data::Dumper;
my @ar = (1, 2);
sub fn
{
    print Dumper \@_;
}
fn @ar;

работает.

Это ожидаемое поведение, о котором говорится в верблюжьей книге.

6 голосов
/ 29 июня 2011

С 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.

Обычно подпрограммы предварительно не декларируются на практике. Обычно это не проблема, поскольку люди обычно используют парены с сабвуферами, созданными программистами.

Perl :: Critic (Модуль, который поддерживает модель Perltopia Дэмиена Конвея, изложенную в Perl Best Practices), предлагает следующие способы обработки подпрограмм:

  • Запретить амперсанд и сигилы.
  • Запретить прототипы подпрограмм.
  • Запретить паренов со встроенными модулями.

Одна из причин, по которой парены со встроенными модулями не используются, заключается в том, чтобы визуально отличать их от программно-определяемых функций, которые традиционно используют парены. Поскольку это необычно для предварительного объявления сабов и не рекомендуется использовать амперсанд (потому что он меняет способ обработки @_) или прототипы (потому что, ну, это длинная история), что оставляет очень сильный фон для использования паренов со сценариями. определенные подводные лодки.

6 голосов
/ 29 июня 2011

Perl может анализировать вызовы подпрограмм без паренов, если они были ранее объявлены (или определены). Например:

sub SaveImages;

SaveImages @img_sources;
4 голосов
/ 29 июня 2011

Здесь много хороших моментов, еще один: см. Также subs прагма .Используемый как use subs qw/SaveImage/; перед вашим вызовом функции (вероятно, ближе к вершине с другими вызовами use), он должен приятно предварительно объявить ваш саб менее навязчивым способом.

0 голосов
/ 29 июня 2011

Вы можете опустить () со встроенными функциями (см. perlfunc ), потому что встроенные функции являются ключевыми словами языка и не требуют, чтобы скобки распознавались как функции.

Некоторые импортированные функции (например, max из List::Util), обычно из базовых модулей, также могут вызываться без круглых скобок.

Если подпрограмма объявлена ​​перед вызовом, скобки также могут быть опущены, хотя Perl Best Practices (глава 2, раздел 4) рекомендует избегать этого, чтобы различать вызовы подпрограмм и встроенные функции.

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