Почему в Perl использовать & getcwd (), а не getcwd ()? - PullRequest
3 голосов
/ 08 ноября 2019

Я новичок в языке Perl, и в коде, который я использую, есть эта строка:

$BASEDIR = &getcwd();

Мне интересно, почему перед вызовом getcwd стоит &и я не смог найти никаких ссылок на этот счет. Может ли кто-нибудь помочь мне с этим?

Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 08 ноября 2019

Это заставляет игнорировать прототип подпрограммы.

$ perl -e'
   sub f($@) { print("@_\n"); }
   my @a = (4,5,6);
   f(4,5,6);
   f(@a);
   &f(@a);
'
4 5 6
3
4 5 6

Но это, вероятно, не причина, по которой он используется здесь. В конце концов, Cwd::getcwd не имеет прототипа. & нельзя использовать с именованными операторами (т. Е. Функциями perlfunc , например, print), поэтому некоторые новички используют его в подпрограммах, чтобы отличать их от операторов. Я полагаю, что это практика, рекомендуемая популярной книгой по Perl.

2 голосов
/ 08 ноября 2019

Краткий ответ: это необязательно, если вы не используете действительно старую версию perl.

Подробнее см. Справочную страницу perlsub (run perldoc perlsub или man perlsub в зависимости от вашей среды)

Подпрограмма может быть вызвана с использованием явного префикса «&». «&» Является необязательным в современном Perl, как и круглые скобки, если подпрограмма была предварительно объявлена. «&» Не является обязательным, когда просто именуется подпрограмма, например, когда она используется в качестве аргумента для define () или undef (). Также не является обязательным, когда вы хотите сделать косвенный вызов подпрограммы с именем подпрограммы или ссылкой, используя конструкции "& $ subref ()" или "& {$ subref} ()", хотя "$ subref -> ()"нотация решает эту проблему. Смотрите perlref, чтобы узнать больше обо всем этом.

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