Вызов функции без &

А теперь, как и было обещано, мы расскажем, в каких случаях можно опускать знак & при вызове пользовательской функции. Если компилятор видит определение функции перед вызовом или если Perl по синтаксису может определить, что перед ним вызов функции, пользовательские функции могут вызываться без знака & по аналогии с встроенными функциями. (В этом правиле имеется одна загвоздка, но об этом чуть позднее.) Таким образом, если Perl по одному синтаксису может определить, что он имеет дело с вызовом функции, знак & можно опустить. Иначе говоря, если вы приводите список параметров в круглых скобках, значит, это вызов функции:

my @cards = shuffle(@deck_of_cards); # Знак & при вызове shuffle
# не обязателен

Если внутренний компилятор Perl уже встречал определение пользовательской функции, знак & обычно тоже можно опустить; в этом случае можно даже опустить скобки в списке аргументов:

sub division {
$_[0] / $_[1]; # Первый параметр делится на второй
}
my $quotient = division 355, 113; # Использует &division

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


Однако объявление пользовательской функции не должно размещаться после вызова, иначе компилятор просто не поймет, о чем идет речь. Чтобы компилятор мог использовать вызовы пользовательских функций по аналогии с вызовами встроенных функций, он должен сначала увидеть определение. Но загвоздка кроется в другом: если имя пользовательской функции совпадает с именем встроенной функции Perl, при ее вызове обязательно должен использоваться знак &. Без него пользовательская функция будет вызвана только при отсутствии одноименной встроенной функции:

sub chomp {
print "Munch, munch!\n";
}
&chomp; # Знак & обязателен!

Без & будет вызвана встроенная функция chomp, несмотря на то, что в программе была определена пользовательская функция chomp. Итак, на практике следует руководствоваться следующим правилом: пока вы не будете знать имена всех встроенных функций Perl, всегда используйте & при вызовах пользовательских функций (вероятно, в вашей первой сотне программ или около того). Но когда вы видите, что другой программист опустил & в своем коде, это не обязательно является ошибкой; возможно, он просто знает, что в Perl нет встроенной функции с таким именем.




Когда программист собирается вызывать пользовательские функции по аналогии со встроенными функциями Perl, он обычно пишет модули и использует прототипы для передачи Perl информации об ожидаемых параметрах. Впрочем, построение модулей – тема нетривиальная; когда вы будете готовы, обратитесь к документации Perl (и особенно к документам perlmod и perlsub) за дополнительной информацией о прототипах пользовательских функций и построении модулей.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Аргументы
Возвращаемые значения
Вызов пользовательской функции
Директива use strict
Нескалярные возвращаемые значения

Вернуться в раздел: Perl / 3. Пользовательские функции