Ответ 1
Код, фактически выполняемый оператором подстановки, вероятно, фактически похож на
my $code = "do { $repl_expr }";
Итак, когда выражение замены _}->{_
, выполняется следующее:
do { _}->{_ }
_
просто возвращает строку _
(так как strict выключен), так что то же, что и
do { "_" }->{_}
что совпадает с
"_"->{_}
У вас есть различие в хэш-элементе, где ссылка является символической ссылкой (т.е. строкой, а не фактической ссылкой). Обычно запрещается строгим, здесь приведен пример символической справки на работе:
%h1 = ( id => 123 );
%h2 = ( id => 456 );
print "h$_"->{id}, "\n"
for 1..2;
Итак, это означает
"_"->{_} # Run-time symbol lookup
совпадает с
$_{_} # Compile-time symbol lookup
Подобный трюк часто используется в однострочном пространстве.
perl -nle'$c += $_; END { print $c }'
можно сократить до
perl -nle'$c += $_; }{ print $c'
Поскольку код, фактически выполняемый при использовании -n
, получается из чего-то эквивалентного
my $code = "LINE: while (<>) { $program }";
%{'_';}
- очень странный способ записи
%{'_'}
который является разыменованием хэшей. Опять же, ссылка здесь является символической ссылкой. Это эквивалентно
%_
В скалярном контексте хэш-ток возвращает значение, которое сообщает некоторую информацию об этом хэш-внутренности (или ложное значение, если оно пусто). Было предложено изменить его, чтобы вернуть количество ключей.