使用Time::Piece的Perl脚本终止时没有输出,没有错误-如何调试?

使用Time::Piece的Perl脚本终止时没有输出,没有错误-如何调试?,perl,datetime,Perl,Datetime,我在Windows10上使用Perl5.22。 我有一个带有时间/日期字符串的数据 12/31/09 08:40:00A 数据是在当地时间,并没有表明时间是否在夏令时,所以我试图确定这一点。我首先尝试将字符串解析为时间值,以便使用 本地时间 对 我正在尝试使用time::Piece解析时间/日期字符串: my $parsedtime = Time::Piece->strptime($timestampstr, '%m/%d/%y %I:%M:%S%p'); 当这一行未注释时,脚本退

我在Windows10上使用Perl5.22。 我有一个带有时间/日期字符串的数据

12/31/09 08:40:00A
数据是在当地时间,并没有表明时间是否在夏令时,所以我试图确定这一点。我首先尝试将字符串解析为时间值,以便使用

本地时间

我正在尝试使用time::Piece解析时间/日期字符串:

  my $parsedtime = Time::Piece->strptime($timestampstr, '%m/%d/%y %I:%M:%S%p');
当这一行未注释时,脚本退出到命令行,没有任何错误或输出。甚至在程序开始时输出到控制台的开始文件名也不会出现

如果我注释掉上面的行和对$parsedtime的引用,脚本的其余部分将正常运行、输出到文件并退出


如何调试Time::Piece的使用?

要构建本地时间,需要使用

Time::Piece::localtime->strptime(...)
而不是

Time::Piece->strptime(...)
所以

输出:

1572760800 2019-11-03T01:00:00-0500 2019-11-03T06:00:00Z
1572764398 2019-11-03T01:59:58-0500 2019-11-03T06:59:58Z
1572764399 2019-11-03T01:59:59-0500 2019-11-03T06:59:59Z
1572764400 2019-11-03T01:00:00-0600 2019-11-03T07:00:00Z
1572764401 2019-11-03T01:00:01-0600 2019-11-03T07:00:01Z
1572767999 2019-11-03T01:59:59-0600 2019-11-03T07:59:59Z
美元/年'6/31/09 08:40:00A' 1. 美元/年'12/31/09 08:40:00A' 0 请注意,时间戳格式不明确。在使用DST的地方,每年有一个小时它会返回错误的结果

关于评论中的问题

use strict;
use warnings;
use feature qw( say );

use DateTime::Format::Strptime qw( );

my $format = DateTime::Format::Strptime->new(
   pattern   => '%m/%d/%y %I:%M:%S%p %Z',
   locale    => 'en',
   zone_map  => { CST => '-0600', CDT => '-0500' }, # Handle non-standard time zone names.
   time_zone => 'America/Chicago',                  # Optional. Convert result to this tz.
   strict    => 1,
   on_error  => 'croak',
);

while (<DATA>) {
   chomp;
   my $dt = $format->parse_datetime($_);
   my $epoch = $dt->epoch;
   my $local_dt_str = $dt->strftime("%Y-%m-%dT%H:%M:%S%z");
   $dt->set_time_zone('UTC');
   my $utc_dt_str = $dt->strftime("%Y-%m-%dT%H:%M:%SZ");
   say "$epoch $local_dt_str $utc_dt_str";
}

__DATA__
11/03/19 01:00:00AM CDT
11/03/19 01:59:58AM CDT
11/03/19 01:59:59AM CDT
11/03/19 01:00:00AM CST
11/03/19 01:00:01AM CST
11/03/19 01:59:59AM CST

我不知道你是什么意思,我能做些什么来调试…-如果您将示例数据字符串放入Time::Piece的特定用法中,它显然会随着解析时间的错误而消失。。。。原因是字符串末尾的A没有意义,也许你是说AM?我显然有几个问题。首先是为什么STDOUT没有出现。我发现STDOUT->autoflush1;现在我可以看到调试输出到失败的行。我添加了使用警告;我也收到了警告,但与时间无关。在我过去的经验中,死亡应该打印信息,但我没有看到它。我用$pline[1]=~s/A/AM/修复了A/AM问题$pline[1]=~s/P/PM/;输入字符串现在是12/31/09 08:40:00AM,但其行为方式仍然相同。当执行Time::Piece->strtime时,脚本结束时没有错误或任何指示。如果它只是死掉而没有打印某些内容,那么问题就出在应用程序的某个地方,比如重定向或关闭STDERR。关于这个程序,我们一无所知,所以这里无法提供帮助。但您询问如何调试该问题,答案是:隔离相关行,向其提供导致其崩溃的输入,然后在程序上下文之外调试该问题,因为这可能只是调试该问题的一种方式。您认为问题在应用程序中的某个地方是正确的。奇怪的是,问题出在脚本后面的代码中,该脚本对意外未定义的值执行比较。将“已定义”添加到条件表达式修复了Time::Piece.Yes中出现的早期退出,解决秋季的歧义是我下一个要解决的问题:11/03/19 12:40:00AM CDT 11/03/19 12:50:00AM CDT 11/03/19 01:00:00AM CDT 11/03/19 01:10:00AM CDT 11/03/19 01:20:00AM CDT 11/03/19 01:30:00AM CDT 11/03/19 01:50:00AM CDT 11/03/19 01:00:00:00AM CDT 11/03/19 01:00:00:00:00CDT 11/03/19 01:40:00AM CDT 11/03/19 01:50:00AM CDT 11/03/19 02:00:00AM CST 11/03/19 02:10:01AM CST请参见答案补充。感谢您提供了时区转换的优秀示例-我学到了很多!我每年使用Perl执行类似的任务几次,但我从来没有像您这样成为真正的专家。我对你在使用声明中使用的qw感到困惑。我在qw上搜索过,但大多数文章的形式都是“引用单词”函数qw用于生成单词列表。你能给我指一下正在使用的语法的解释吗?。使用模块;执行模块并调用其导入方法,这通常会导致模块导出默认符号列表。如果您提供一个列表,例如使用模块qw foo bar;,它被传递到导入,这通常会导致模块导出这些符号。作为一种特殊语法,使用Module;并使用qw模块;导致根本不调用导入,从而导致不导出任何内容。我喜欢明确说明我导入的内容,这样读者和我就不必猜测子模块来自哪个模块。
1572760800 2019-11-03T01:00:00-0500 2019-11-03T06:00:00Z
1572764398 2019-11-03T01:59:58-0500 2019-11-03T06:59:58Z
1572764399 2019-11-03T01:59:59-0500 2019-11-03T06:59:59Z
1572764400 2019-11-03T01:00:00-0600 2019-11-03T07:00:00Z
1572764401 2019-11-03T01:00:01-0600 2019-11-03T07:00:01Z
1572767999 2019-11-03T01:59:59-0600 2019-11-03T07:59:59Z