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

前端之家收集整理的这篇文章主要介绍了perl – 如何在插入警告后抑制哈希?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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;

猜你在找的Perl相关文章