Вы не синтаксис совершенно прав. В ваших примерах вызывается подпрограмма (&
обходит любые прототипы) и передает либо возвращаемое значение (&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
будут видны при вызове команды. Во второй форме их не будет; каждый вызов будет видеть значение в момент создания привязки. Обе формы полезны; вам просто нужно проявлять здравый смысл при принятии решения о том, что использовать.
Я просвещен. Но я до сих пор не понимаю, почему синтаксис '\ & calculate' не работает со мной ... – Zaid
@ Zaid: Я запустил код примера, изменяя' sub {calculate()} 'на' \ & calculate', и он работал как ожидается. Говорить, что это «не работает», безнадежно расплывчато. Что случилось, когда вы попробовали? –
'\ & calculate' сам по себе работает. Массивref был тем, что меня сбивало с толку, но ваше объяснение объясняет почему. Спасибо, куча ... Если бы я мог, я бы повысил вдвое больше! – Zaid