显然,我不需要这个;我只是好奇这里发生了什么。我失踪了吗
简单的东西?我可以在所有版本的 Perl 中依赖这种行为吗?)
Perl v5.8.8:
%h = ( 0=>'zero', 1=>'one', 2=>'two' );
while ($k = each %h) {
$v = delete $h{$k};
print "deleted $v; remaining: @h{0..2}\n";
}
输出
deleted one; remaining: zero two
deleted zero; remaining: two
deleted two; remaining:
man perlfunc
(每个)都没有解释为什么当
$k
时循环继续赋值为 0。代码的行为就像
while
上的条件一样。环形是
($k = each %h, defined $k)
.如果循环条件实际更改为
($k = each %h, $k)
那么它确实停在
$k = 0
正如预期的那样。它也停在
$k = 0
对于以下each
的重新实现:%h = ( 0=>'zero', 1=>'one', 2=>'two' );
sub each2 {
return each %{$_[0]};
}
while ($k = each2 \%h) {
$v = delete $h{$k};
print "deleted $v; remaining: @h{0..2}\n";
}
只输出:
deleted one; remaining: zero two
最佳答案
您调用each
在标量上下文中,因此由于列表返回值而无法正常工作。
就像
while ($line = <FILE>)
是添加隐式
defined
的特殊情况, 也是while ($key = each %hash)
在 5.8.8 中,这发生在 op.c,第 3760-3766 行:
case OP_SASSIGN:
if (k1->op_type == OP_READDIR
|| k1->op_type == OP_GLOB
|| (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
|| k1->op_type == OP_EACH)
expr = newUNOP(OP_DEFINED, 0, expr);
break;
我不确定这是否适用于所有版本的 Perl 5。
另见:When does while() test for defined vs truth在 PerlMonks 上。我找不到 Perl 文档中提到的地方(提到了
<FILE>
的情况,但我没有看到 each
的情况)。
关于Perl:while ($key = each %hash) 不会在 key = 0 处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/220879/