кажущаяся странность при использовании подпрограммы с оператором умножения - PullRequest
4 голосов
/ 18 февраля 2011

Пожалуйста, не могли бы вы объяснить это * явно * противоречивое поведение для меня:

use strict;
sub a { 2 + 2 };
print 2 * a(); # this prints: 8
print a() * 2; # this prints: 8
print 2 * a;   # this prints: 8
print a * 2;   # this prints: 4

Спасибо за ответы, оба очень полезны - я многому научился.

Ответы [ 2 ]

12 голосов
/ 18 февраля 2011

Deparse показывает, что вы передаете глобус в последний из них:

$ perl -MO=Deparse,-p
use strict;
sub a { 2 + 2 };
print 2 * a(); # this prints: 8
print a() * 2; # this prints: 8
print 2 * a; # this prints: 8
print a * 2; # this prints: 4
__END__
sub a {
    use strict 'refs';
    4;
}
use strict 'refs';
print((2 * a()));
print((a() * 2));
print((2 * a()));
print(a(*2));

Использование паренов в вызовах подпрограммы - это хорошо ...

6 голосов
/ 18 февраля 2011

В последнем примере выражение анализируется как a(*2), что вызывает a с аргументом glob *2, который является коротким именем переменной пакета *main::2

Если вы хотите, чтобы a был проанализирован как функция, которая не принимает аргументов, вам нужно объявить это следующим образом:

sub a () {2 + 2}

Тогда Perl проанализирует оператор так, как вы ожидали. Фактически, если вы напишите это так, Perl обнаружит, что это постоянная функция, и вставит 4 в каждом месте, где был бы вызван a.

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