Perl:在 /Date/Manip.pm 的数字 lt (<) 中使用未初始化的值

Perl: Use of uninitialized value in numeric lt (<) at /Date/Manip.pm

提问人: 提问时间:9/17/2008 最后编辑:mtk 更新时间:2/27/2013 访问量:4333

问:

这让我感到困惑。此代码在另一台服务器上运行,但在 Perl v5.8.8 上失败,今天从 CPAN 加载了 Date::Manip

Warning:
Use of uninitialized value in numeric lt (<) at /home/downside/lib/Date/Manip.pm line 3327.
at dailyupdate.pl line 13
        main::__ANON__('Use of uninitialized value in numeric lt (<) at
/home/downsid...') called at
/home/downside/lib/Date/Manip.pm line 3327
        Date::Manip::Date_SecsSince1970GMT(09, 16, 2008, 00, 21, 22) called at
/home/downside/lib/Date/Manip.pm line 1905
        Date::Manip::UnixDate('today', '%Y-%m-%d') called at
TICKER/SYMBOLS/updatesymbols.pm line 122
        TICKER::SYMBOLS::updatesymbols::getdate() called at
TICKER/SYMBOLS/updatesymbols.pm line 439
        TICKER::SYMBOLS::updatesymbols::updatesymbol('DBI::db=HASH(0x87fcc34)',
'TICKER::SYMBOLS::symbol=HASH(0x8a43540)') called at
TICKER/SYMBOLS/updatesymbols.pm line 565
TICKER::SYMBOLS::updatesymbols::updatesymbols('DBI::db=HASH(0x87fcc34)', 1, 0, -1) called at
dailyupdate.pl line 149
        EDGAR::updatesymbols('DBI::db=HASH(0x87fcc34)', 1, 0, -1) called at
dailyupdate.pl line 180
        EDGAR::dailyupdate() called at dailyupdate.pl line 193

失败的代码很简单:

sub getdate()
{    my $err;                ## today
    &Date::Manip::Date_Init('TZ=EST5EDT');       
    my $today = Date::Manip::UnixDate('today','%Y-%m-%d'); ## today's date
    ####print "Today is ",$today,"\n";        ## ***TEMP***
    return($today);
}

没错;日期::Manip 失败。"today"

Date::Manip 中失败的行是:

  my($tz)=$Cnf{"ConvTZ"};  
  $tz=$Cnf{"TZ"}  if (! $tz);  
  $tz=$Zone{"n2o"}{lc($tz)}  if ($tz !~ /^[+-]\d{4}$/);  

  my($tzs)=1;  
  $tzs=-1 if ($tz<0); ### ERROR OCCURS HERE  

所以 Date::Manip 假设它已经用元素或 .这些是在 中初始化的,因此应该已经处理好了。$Cnf"ConvTZ""TZ"Date_Init

它只是在我的大型程序中失败了。如果我只是提取上面的“” 并独立运行它,没有错误。所以有一些东西是关于 影响这一点的全球环境。getdate()

这似乎是一个已知但尚未理解的问题。如果您在 Google 上搜索 “使用未初始化的值日期操纵”大约有 2400 次点击。 MythTVgrepmail 报告了此错误。

Perl 日期 模块 警告

评论

0赞 Darren Meyer 9/17/2008
很难阅读你的代码。如果确保粘贴代码,使每行都以制表符或至少 3 个空格开头,则格式会更好。
0赞 Jon Ericson 9/17/2008
我相信它需要 4 个空格。(“五号就出来了。

答:

2赞 Darren Meyer 9/17/2008 #1

几乎可以肯定的是,您的主机没有您指定的时区的定义,这就是导致值未定义的原因。

您是否检查以确保主机上确实存在同名的 TZ 定义文件?

0赞 John Nagle 9/17/2008 #2

日期::Manip 应该是独立的。它在自己的源中有一个所有时区的列表,在“$zonesrfc=”之后。

-2赞 Sam Kington 9/17/2008 #3

您能否尝试单步执行调试器,看看到底出了什么问题?很可能是 %Zone 出错了 - %tz 可能在第 1 行或第 2 行正确设置,但随后在第 3 行的查找失败,最终以 undef 结束。

编辑:%Date::Manip::Cnf 和 %Date::Manip::Zone 是全局变量,因此您应该能够在调用 Date::Manip::D ate_Init 之前和之后对它们进行转储。如果我正确阅读了源代码,%Cnf 应该在调用 Date_Init 之前包含配置选项的基本框架,并且 %Zone 应该是空的;Date_Init后,TZ 应具有您选择的值,并且 %Zone 应由时区查找表填充。

我看到对 .%Cnf 中的 DateManip.cnf,这可能是要查看的内容 - 您的主目录或当前工作目录中是否有这样的文件,它覆盖了默认设置?

3赞 4 revsschwerwolf #4

这是 Win32 的 Date::Manip 版本 5.48-5.54 中的一个错误。我在使用时区的标准/日光变体时遇到了困难,例如“EST5EDT”、“美国/东部”。唯一似乎有效的时区是那些没有夏令时的时区,例如“EST”。

可以在 Date::Manip 模块中关闭时区转换处理:

Date::Manip::Date_Init("ConvTZ=IGNORE");

如果您正确对待日期,这将产生不良副作用。我不会使用此解决方法,除非您确信您永远不会处理来自不同时区的日期。