Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:while($key=each%hash)不';t在键=0时停止_Perl_Hash_Each_While Loop - Fatal编程技术网

Perl:while($key=each%hash)不';t在键=0时停止

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

显然,我不需要这个;我只是好奇这里发生了什么。我失踪了吗 简单点?我可以在所有版本的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循环继续。 代码的行为就像
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