这令我感到困惑。这段代码在另一台服务器上运行,但它在今天从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次点击。 已使用MythTV和grepmail报告此错误。
答案 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的引用,可能需要注意一下 - 你的主目录中是否有这样的文件,或者是当前的工作目录,它会覆盖默认设置?