Use of
each()
on hash after insertion without resetting hash iterator results in undefined behavior,Perl interpreter:0x13932010
at/srv/data203806/MUXmh-Migration/Newperl/localperl/lib/site_perl/5.18.1/x86_64-linux-thread-multi/forks.pm
line 1736.
解决方法
这警告:
use strict; use warnings; use Data::Dumper; my %h = (a=>1); while (my ($k,$v) = each %h) { $h{b} = 2; } print Dumper \%h;
这使警告无声:
use strict; use warnings; use Data::Dumper; my %h = (a=>1); { no warnings qw(internal); while (my ($k,$v) = each %h) { $h{b} = 2; } } print Dumper \%h;
请注意,静音的警告类别称为内部.我怎么知道这个?对于Perl的警告类别,我有一些惊人的记忆吗?不是.所有Perl的错误和警告消息都在perldiag中有详细记录;对于每个警告,它提到它所属的类别.
也就是说,这个警告告诉你一个真正的问题.您的代码行为未定义;如果你切换到不同版本的Perl,它可能突然开始采取不同的行动.关闭警告比修复你的代码更好!
在上面的例子中,快速解决方法是使用每个循环来复制%h而不是%h本身.
use strict; use warnings; use Data::Dumper; my %h = (a=>1); { my %tmp = %h; while (my ($k,$v) = each %tmp) { $h{b} = 2; } } print Dumper \%h;