each()插入后使用on hash而不重置散列迭代器会导致未定义的行为,Perl解释器:0x13932010在/srv/data203806/MUXmh-Migration/Newperl/localperl/lib/site_perl/5.18.1/x86_64-linux-thread-multi/forks.pm第1736行.
我的代码中的所有内容都运行良好但我收到此错误.我怎么能压制这个警告?
tob*_*ink 11
这警告:
use strict;
use warnings;
use Data::Dumper;
my %h = (a=>1);
while (my ($k,$v) = each %h) {
$h{b} = 2;
}
print Dumper \%h;
Run Code Online (Sandbox Code Playgroud)
这使警告无声:
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;
Run Code Online (Sandbox Code Playgroud)
请注意,要调用静音警告类别internal.我怎么知道这个?对于Perl的警告类别,我有一些惊人的记忆吗?不是.所有Perl的错误和警告信息都在perldiag中有详细记录; 对于每个警告,它提到它所属的类别.
也就是说,这个警告告诉你一个真正的问题.您的代码行为未定义; 如果你切换到不同版本的Perl,它可能突然开始采取不同的行动.关闭警告比修复你的代码更好!
在上面我举的例子,速战速决是使用each通过循环复制的%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;
Run Code Online (Sandbox Code Playgroud)