提问人: 提问时间:9/17/2008 最后编辑:mtk 更新时间:2/27/2013 访问量:4333
Perl:在 /Date/Manip.pm 的数字 lt (<) 中使用未初始化的值
Perl: Use of uninitialized value in numeric lt (<) at /Date/Manip.pm
问:
这让我感到困惑。此代码在另一台服务器上运行,但在 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 次点击。 MythTV 和 grepmail 报告了此错误。
答:
几乎可以肯定的是,您的主机没有您指定的时区的定义,这就是导致值未定义的原因。
您是否检查以确保主机上确实存在同名的 TZ 定义文件?
日期::Manip 应该是独立的。它在自己的源中有一个所有时区的列表,在“$zonesrfc=”之后。
您能否尝试单步执行调试器,看看到底出了什么问题?很可能是 %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,这可能是要查看的内容 - 您的主目录或当前工作目录中是否有这样的文件,它覆盖了默认设置?
这是 Win32 的 Date::Manip 版本 5.48-5.54 中的一个错误。我在使用时区的标准/日光变体时遇到了困难,例如“EST5EDT”、“美国/东部”。唯一似乎有效的时区是那些没有夏令时的时区,例如“EST”。
可以在 Date::Manip 模块中关闭时区转换处理:
Date::Manip::Date_Init("ConvTZ=IGNORE");
如果您正确对待日期,这将产生不良副作用。我不会使用此解决方法,除非您确信您永远不会处理来自不同时区的日期。
评论