使用Time::Piece的Perl脚本终止时没有输出,没有错误-如何调试?
我在Windows10上使用Perl5.22。 我有一个带有时间/日期字符串的数据使用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'); 当这一行未注释时,脚本退
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