В последнем примере выражение анализируется как a(*2)
, что вызывает a
с аргументом glob *2
, который является коротким именем переменной пакета *main::2
Если вы хотите, чтобы a
был проанализирован как функция, которая не принимает аргументов, вам нужно объявить это следующим образом:
sub a () {2 + 2}
Тогда Perl проанализирует оператор так, как вы ожидали. Фактически, если вы напишите это так, Perl обнаружит, что это постоянная функция, и вставит 4
в каждом месте, где был бы вызван a
.