Невозможно запустить подпрограмму внутри хеша подпрограмм в 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, который затем разыменовывается. Пожалуйста, не используйте это!

Другие вопросы по тегам