Perl模块错误 - defined(%hash)已过时

5

背景:

  • 我正在努力将一台Linux服务器从Ubuntu 10.04迁移到12.04的新版本。
  • 该服务器负责通过crontabs执行多个Perl模块。
  • 这些Perl模块严重依赖于30-40个Perl扩展。
  • 我已经安装了所有Perl扩展,crontabs能够成功处理,但由于这些Perl扩展的新版本导致的几个语法错误,无法正常处理。
  • 我需要一些帮助来修改语法,使得Perl脚本能够按照预期进行处理。

错误:

defined(%hash) is deprecated at pm/Alerts/Alerts.pm line 943.
        (Maybe you should just omit the defined()?)
defined(%hash) is deprecated at pm/Alerts/Alerts.pm line 944.
        (Maybe you should just omit the defined()?)

代码:

###
    # Iterate the arrays deleting identical counts from each.
    # If we found a mismatch then die.
    # If either array is not empty when we are done then die
    $logger->info('Comparing ' . (scalar keys %cms_rows) . ' CMS symbols to ' . (scalar keys %stats_rows) . ' STATS symbols');

    foreach my $symbol ( keys %cms_rows ) {
    my %cms_row = delete $cms_rows{$symbol};
    my %stats_row = delete $stats_rows{$symbol};

##LINE 943##    die("Error: NULL CMS counts for symbol '$symbol'") unless defined %cms_row;
##LINE 944##    die("Error: NULL Stats counts for symbol '$symbol'") unless defined %stats_row;

    my $cms_json = encode_json(\%cms_row);
    my $stats_json = encode_json(\%stats_row);
    $logger->debug("Comparing counts for '$symbol': CMS($cms_json), Stats($stats_json)");

    die("Error: Up Counts Don't match for symbol '$symbol': CMS($cms_json), Stats($stats_json)") unless (!defined $cms_row{1} && !defined $stats_row{1}) || $cms_row{1} == $stats_row{1};
    die("Error: Down Counts Don't match for symbol '$symbol': CMS($cms_json), Stats($stats_json)") unless (!defined $cms_row{-1} && !defined $stats_row{-1}) || $cms_row{-1} == $stats_row{-1};
    }
    ###

希望有人能够帮助解决这个问题,非常感激任何帮助。


3
只是为了明确:Perl的新版本并没有导致错误,它们只是向您展示这些错误存在。此外,这是一个非致命性警告,而不是语法错误。我假设重点是检查哈希是否为空,在这种情况下,您可以使用unless %hash。就像这个答案所显示的那样:https://dev59.com/uGox5IYBdhLWcg3wFAfW#9444942 - TLP
1个回答

10
你一定是从一个非常老的Perl版本升级过来的。Perl 5.6.1 release notes 中写道:

defined(%hash) 已被弃用

(D) 在哈希表上使用 defined() 通常没有用,因为它检查的是未定义的标量值。如果您想知道哈希表是否为空,只需使用例如 if (%hash) { # not empty }

这种做法一直都很愚蠢,现在Perl会警告你正在做一些愚蠢的事情。警告已经很清楚地说明了你应该怎么做来解决问题:

也许你只需要省略 defined()?

所以你的代码应该变成:
die("Error: NULL CMS counts for symbol '$symbol'") unless %cms_row;
die("Error: NULL Stats counts for symbol '$symbol'") unless %stats_row;

2
仅仅为了量化“非常古老”,Perl 5.6.1发布于2001年4月! - ThisSuitIsBlackNot
谢谢。我本来想在我的回答中包含那个信息,但是我忘记了。 - Dave Cross
非常感谢你,Dave。这个方法很有效。如果我仔细阅读一些,我可能会自己得出这个答案。:)但我不是一个PERL程序员,所以我不想冒险。我实际上只是检查了版本,它是Perl 5.10.0,我相信它来自2007年,还是相当古老的:(。这是30个不同错误中的一个,其中我只剩下4个。幸运的是,我能够通过谷歌解决其余的问题。再次感谢。节日快乐。 - virtual020
你为什么要升级到这么旧的Perl版本? - Dave Cross
哦,抱歉我没有表达清楚,我正在从Perl 5.10.0升级到Perl 5.14.2。我基本上是将服务器迁移到新的云平台。我正在处理的网站运行在专有代码和几年前我们有内部程序员创建的自定义模块上。现在不再是这种情况了,幸运的是我已经设法解决了代码问题,并且只剩下很少的错误。 - virtual020

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接