IMO, единственное время, когда есть какая-либо причина использовать &
, это если вы получаете или вызываете coderef, например:
sub foo() {
print "hi\n";
}
my $x = \&foo;
&$x();
Основное время, когда вы можете использовать его, что вы абсолютно не должны в большинстве случаев, - это когда вызывается подпрограмма с прототипом, который задает любое поведение вызова не по умолчанию. Под этим я подразумеваю, что некоторые прототипы допускают реинтерпретацию списка аргументов, например, преобразование спецификаций @array
и %hash
в ссылки. Таким образом, подпрограмма будет ожидать, что эти реинтерпретации произойдут, и, если вы не пойдете на ту длину, которая необходима для имитации их вручную, подпрограмма получит входные данные, сильно отличающиеся от ожидаемых.
Я думаю, что в основном люди пытаются сказать вам, что вы все еще пишете в стиле Perl 4, и теперь у нас есть более понятная и приятная вещь, называемая Perl 5.
Относительно производительности, существуют различные способы, которыми Perl оптимизирует суб-вызовы, которые &
побеждают, причем одним из основных является встраивание констант.
Существует также одно обстоятельство, при котором использование &
обеспечивает выигрыш в производительности: если вы переадресовываете дополнительный вызов с помощью foo(@_)
. Использование &foo
бесконечно быстрее, чем foo(@_)
. Я бы не стал рекомендовать это, если вы не определите профилированием, что вам нужна эта микрооптимизация.