【问题标题】:Perl Module Error - defined(%hash) is deprecatedPerl 模块错误 - 已弃用定义(%hash)
【发布时间】:2016-04-02 15:35:12
【问题描述】:

背景:

  • 我正在努力将 Linux 服务器从 Ubuntu 10.04 迁移到较新的服务器到 12.04
  • 此服务器负责通过 crontab 执行多个 Perl 模块。
  • 这些 Perl 模块严重依赖于 30-40 个 perl 扩展。
  • 我已经安装了所有 Perl 扩展并且 crontab 能够成功处理,但这些 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};
    }
    ###

希望有人可以帮助解决这个问题,任何帮助表示赞赏。

【问题讨论】:

  • 要明确一点:新版本的 Perl 并没有引起错误,它们只是向您展示了它们的存在。这也是一个非致命警告,而不是语法错误。我认为重点是检查哈希是否为空,在这种情况下,您可以使用unless %hash。就像这个答案所示:stackoverflow.com/questions/9444915/…

标签: linux perl hash crontab perl-module


【解决方案1】:

您一定是从非常旧的 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;

【讨论】:

  • 只是为了量化“严重老”,Perl 5.6.1 早在 2001 年 4 月就已经发布了!
  • 谢谢。我打算在我的答案中包含这些信息,但我没想到。
  • 非常感谢戴夫,这很有效,猜猜如果我能更仔细地阅读,我会自己想出这个答案。 :) 但不是 PERL 程序员,我不想碰运气。我实际上只是检查了版本及其 Perl 5.10.0 我相信它从 2007 年开始仍然很旧:(。这是 30 个不同的错误中的一个,其中我只剩下 4 个。幸运的是我能够用谷歌解决其余的错误. 再次感谢。节日快乐。
  • 你为什么要升级到这么旧的 Perl 版本?
  • 哦,不,抱歉没有说明清楚我正在从 Perl 5.10.0 升级到 Perl 5.14.2。我基本上是将服务器迁移到新的云平台。我正在使用的网站运行在几年前我们有内部程序员时创建的专有代码和自定义模块上。现在已经不是这样了,幸运的是我已经设法解决了代码并完成了它,并且几乎没有剩余的错误。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
  • 2019-03-06
相关资源
最近更新 更多