У вас не совсем правильный синтаксис. В ваших примерах вызывается подпрограмма (&
обходит любые прототипы) и передает либо возвращаемое значение (&calculate()
), либо ссылку на него (\&calculate()
) в параметр -command
. Вы хотите назначить ссылку на саму подпрограмму, что вы можете сделать через:
-command => \&calculate
Обратите внимание на отсутствие конечных скобок. Также обратите внимание, что вы не можете передавать аргументы таким образом. Если вы хотите сделать это, вам нужно либо обернуть вызов в анонимную подпрограмму:
-command => sub { calculate(12) }
или передайте опцию ссылку ARRAY вместо ссылки CODE:
-command => [\&calculate, 12]
Существует небольшая разница между двумя формами, которая важна, если вы используете переменную вместо литерального значения.
-command => sub { calculate($x) } # creates a closure over $x
-command => [\&calculate, $x] # makes a copy of $x
При использовании первой формы изменения на $x
будут видны при вызове команды. Под второй формой они не будут; каждый вызов будет видеть значение в момент создания привязки. Обе формы полезны; вам просто нужно проявить здравый смысл при принятии решения, какой из них использовать.