Невозможно запустить подпрограмму внутри хеша подпрограмм в Perl
Привет, я новичок в Perl. У меня есть хэш perl, содержащий подпрограммы. Я пытался запустить его различными способами, которые я нашел в Интернете. Но ничего не работает. Мой код:
%hashfun = (
start=>sub { print 'hello' },
end=>sub { print 'bye' }
);
И я попробовал следующее и многое другое.
print "\n $hashfun{start} \n";
что приводит к следующему выводу:
КОД (<шестнадцатеричное значение>)
Потом я попробовал
print "\n $hashfun{start}->() \n";
что приводит к следующему
КОД (<шестнадцатеричное значение>) ->()
Как исправить?
1 ответ
Ваша последняя попытка - правильный синтаксис, но не в том месте. Вы не можете запустить код внутри строковой интерполяции 1. Переместите это за пределы двойных кавычек ""
,
print "\n";
$hashfun{start}->();
print"\n";
Важно не print
фактический вызов $hashfun{start}
потому что это вернется 1
, Это потому, что подпрограмма в Perl всегда возвращает возвращаемое значение последнего оператора внутри подпрограммы (который может быть return
). Здесь это print
, И возвращаемое значение print
является 1
если печать прошла успешно. Так print "\n", $hashfun{start}->(), "\n";
будет выводить
Привет 1
1) На самом деле вы можете, но вы действительно не должны. print "\n@{[&{$hashfun{start}}]}\n";
буду работать. Это очень волшебно, и вы не должны этого делать.
Поскольку массивы можно интерполировать в строки, массив разыскивается внутри двойных кавычек. Материал внутри этого дерефа запускается, поэтому &$hashfun{start}
(это другой способ вызова coderef) запускается. А потому что возвращается 1
и это не ссылка на массив, нам нужно обернуть его в []
поместить его в массив ref, который затем разыменовывается. Пожалуйста, не используйте это!