我知道一点点perl,但不够深入了解下一个.
阅读perldelta 5.18我发现下一段代码5.18中已经禁用了.不算这个,还是要了解它是如何工作的.
%_=(_,"Just another "); #initialize the %_ hash with key=>value _ => 'Just another' $_="Perl hacker,\n"; #assign to the $_ variable with "Perl..." s//_}->{_/e; # darkness. the /e - evauates the expression,but... print
它打印:
Just another Perl hacker,
我试过,perl -MO = Deparse并得到下一个
(%_) = ('_','Just another '); #initializing the %_ hash $_ = "Perl hacker,\n"; # as above s//%{'_';}/e; # substitute to the beginning of the $_ - WHAT? print $_; # print the result japh Syntax OK
什么是奇怪的(至少对我来说) – 运行“deparsed”代码并没有给出原始的结果和打印:
1/8Perl hacker,
我会很高兴:
>如果有人可以解释代码,特别是如果有人可以编写一个帮助代码,(附加步骤)什么帮助我了解它是如何工作的 – 会发生什么.
>解释为什么deparsed代码不打印原始的结果.
什么意思是代码中的%{‘_’}?
解决方法
代码操作符实际执行的代码可能实际上是类似的
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 }";
%{'_';}
是一种非常奇怪的写法
%{'_'}
这是一个哈希取消引用.再次,这里的参考是一个象征性的参考.相当于
%_
在标量上下文中,哈希电流返回一个值,该值报告有关该哈希内部的一些信息(如果为空则返回假值).有一个建议改变它返回键的数量.