插入警告后如何抑制哈希?

Nag*_*wda 4 perl

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)