Perl:while($key=each%hash)不';t在键=0时停止
显然,我不需要这个;我只是好奇这里发生了什么。我失踪了吗 简单点?我可以在所有版本的Perl中依赖这种行为吗?) Perl v5.8.8:Perl:while($key=each%hash)不';t在键=0时停止,perl,hash,each,while-loop,Perl,Hash,Each,While Loop,显然,我不需要这个;我只是好奇这里发生了什么。我失踪了吗 简单点?我可以在所有版本的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 t
%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循环继续。
代码的行为就像while
循环中的条件一样
WARE($k=每个%h,定义为$k)
如果循环条件实际更改为
($k=每个%h,$k)
那么它确实是
按预期在$k=0处停止
对于以下情况,它也会在$k=0
处停止
重新实施每个
:
%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
您正在标量上下文中调用每个,因此由于列表返回值,它无法工作 就像
while ($line = <FILE>)
在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;
我不确定这是否适用于所有版本的Perl5
另见:关于帕尔蒙克斯。我找不到Perl文档中提到的位置(提到了
案例,但我没有看到每个案例)。谢谢,cjm。
很明显,定义了一个defined
对glob来说是这样的但不是在那里
记录在案。现在至少我知道了有限的案例
这一特殊处理适用
但是这些信息应该在perlfunc的文档中,
不仅仅是Perl源代码 cjm是对的。我只想补充一点,当遇到像这样奇怪的事情时,通过运行代码来了解Perl是如何理解代码的通常是很有帮助的。我也喜欢使用-p开关来显示优先级错误
$ perl -MO=Deparse,p your_example.plx
(%h) = (0, 'zero', 1, 'one', 2, 'two');
while (defined($k = each %h)) {
$v = delete $h{$k};
print "deleted $v; remaining: @h{0..2}\n";
}
your_example.plx syntax OK
$ perl -MO=Deparse,p your_example.plx
(%h) = (0, 'zero', 1, 'one', 2, 'two');
while (defined($k = each %h)) {
$v = delete $h{$k};
print "deleted $v; remaining: @h{0..2}\n";
}
your_example.plx syntax OK