加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:25:50 所属栏目:大数据 来源:网络整理
导读: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 l

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读