14

我对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,

我会很高兴:

  1. 如果有人可以解释代码,特别是如果有人可以编写帮助代码,(通过额外的步骤)什么可以帮助我理解它是如何工作的 - 会发生什么。
  2. 解释一下,为什么解析后的代码不打印原​​始结果。

%{'_';}解析后的代码中的 是什么意思?

4

1 回答 1

14

替换运算符实际执行的代码实际上可能类似于

my $code = "do { $repl_expr }";

因此,当替换表达式为 时_}->{_,将执行以下操作:

do { _}->{_ }

_简单地返回字符串_(因为严格是关闭的),所以这与

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 }";

%{'_';}

是一种很奇怪的写法

%{'_'}

这是一个哈希解引用。同样,这里的引用是一个符号引用。相当于

%_

在标量上下文中,哈希当前返回一个值,该值报告有关该哈希内部的一些信息(如果为空,则返回一个假值)。有人建议将其更改为返回键的数量。

于 2013-06-01T19:47:37.993 回答