这令我感到困惑。 这段代码在另一台服务器上工作,但它在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);
}

那就对了; 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报告了此错误。

===============>>#1 票数:3

这是Win32的Date :: Manip版本5.48-5.54中的错误 我在使用时区的标准/日光变体方面遇到了困难,例如'EST5EDT','US / Eastern'。 唯一可行的时区是没有夏令时的时区,例如'EST'。

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

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

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

===============>>#2 票数:2

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

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

===============>>#3 票数:0

Date :: Manip应该是自包含的。 在“$ zonesrfc =”之后,它在其自己的源中有一个包含所有时区的列表。

===============>>#4 票数:-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的引用,可能需要注意一下 - 您的主目录中是否有这样的文件,或者当前工作目录是否覆盖了默认设置?

  ask by translate from so

未解决问题?本站智能推荐:

2回复

为什么要使用“ perl Foo.pm”和“ perl -I”。 -mFoo -e1`表现不同吗?

在Foo.pm中使用以下代码: 将文件作为模块加载不会出现任何错误: 但是,直接加载文件可以: 此外, perl -e'require "Foo.pm"'也不会发出警告。 为什么会有这种差异? 显然,文件的解析方式不同,但是如何以及为什么呢?
2回复

如何抑制加载模块代码中发出的Perl警告?

我的Perl程序正在从通过USB连接的串行设备读取数据。 我在伪Perl中的脚本标题: 一切正常,甚至当我从USB上拔下设备时,我能够从那种情况中恢复,当设备文件消失并重新出现时。 我可以捕获从我自己的脚本中生成的所有错误,但加载的模块(Device :: SerialPort)也会
4回复

Perl日期功能/模块能够理解完整的非缩写月份

假设我从包含日期的某处读取了一个字符串,并且它的日期格式不缩写月份。 是否有一个模块可以处理读入的内容,然后将其输出为我选择的任何格式? 我快速浏览了CPAN,我查看的每个日期模块似乎都没有容纳一个简短的月份。 谢谢你的帮助 编辑:例如,说我们有一个像这样的字符串; “ 198
3回复

为什么在使用Date :: Manip的sortByLength时收到“未初始化的值”警告?

Date :: Manip模块中Date / Manip.pm中的这段代码如何: 我收到此警告:
1回复

Perl警告:在连接或字符串中使用未初始化的值

我越来越: 创建此警告的代码如下: 它来自“while”块中的“print ... join ....”行,但我不确定100%是由什么引起它以及如何纠正它。 $ delimiter先前初始化$ delimiter =“|” 并且@row从前一行的$ sth操作中获取其值。
1回复

Perl警告和regex问题在regexp编译中使用未初始化的值

我正在从我的主要Perl程序中调用以下脚本。 该脚本采用进程名称并返回其PID。 通过使用require关键字,脚本包含在我的主要perl代码中: 并使用以下命令调用: getPid.pl是: 但是,调用脚本时,出现以下警告: 在getPid.pl第19行的
3回复

为什么perl报告了关于elsif中使用的未初始化值的此警告的错误行号?

我对一些Perl代码发出了一个奇怪的警告,我希望SO大脑可以提供帮助。 有问题的代码是: 当我运行我的代码时,我收到以下警告: 第67行等于if($result != 0) { line。 我的问题是双重的: 为什么Perl中指出$result是不确定的,当
2回复

String'eq'Perl中未初始化的值

我正在收到运行我的一个Perl脚本的警告。 错误是在一个简单的if语句中引发的,我正在测试数组中的字符串是否等于另一个字符串。 我和我的同事尝试了几种情况,仍然无法解决警告。 到目前为止,我已经尝试将我的所有研究都放到这个帖子中,所以它有点长,但请坚持下去。 我完全陷入困境,并希望S
3回复

为什么Perl会在我的CGI脚本中抱怨“使用未初始化的值”?

我正在清理生产版本的Perl代码,并在Apache错误日志中遇到了一个奇怪的警告。 它说: [Thu Nov 5 15:19:02 2009] Clouds.pm: Use of uninitialized value $name in substitution (s///) at /
3回复

为什么我的Perl程序会警告未初始化的值?

我写了一个Perl脚本,下面会生成一个警告,但我找不到原因。 它说“ Use of uninitialized value in string eq at ./x.pl line 4. ”。 第4行是“ if ( $status eq "" ) ”行,但变量已初始化。 任何想