4

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

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

这是正确的; Date::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已报告此错误。

4

4 回答 4

3

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

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

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

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

于 2008-10-03T15:05:54.507 回答
2

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

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

于 2008-09-16T20:33:33.427 回答
0

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

于 2008-09-16T20:42:48.427 回答
-2

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

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

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

于 2008-09-17T11:23:25.860 回答