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

时间:2008-09-16 20:29:53

标签: perl date module warnings

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

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);
}

这是对的; "today" Date::Manip失败了。

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()” 并独立运行,没有错误。所以有一些关于 影响这种情况的全球环境。

这似乎是一个已知但未被理解的问题。如果你搜索谷歌 “使用未初始化的值日期操作”有大约2400次点击。 已使用MythTVgrepmail报告此错误。

4 个答案:

答案 0 :(得分:3)

对于Win32,它是Date :: Manip版本5.48-5.54中的bug。我在使用时区的标准/日光变体方面遇到了困难,例如: 'EST5EDT','美国/东部'。唯一可行的时区是没有夏令时的时区,例如: 'EST'。

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

Date :: Manip应该是自包含的。在“$ zonesrfc =”。

之后,它在其自己的源中有一个包含所有时区的列表

答案 3 :(得分:-2)

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

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

我在%Cnf中看到了对.DateManip.cnf的引用,可能需要注意一下 - 你的主目录中是否有这样的文件,或者是当前的工作目录,它会覆盖默认设置?

相关问题