我有正则表达式教练验证的正则表达式
(\d+)\.(\d+)\.(\d+) (\d+):(\d+):(\d+)
这符合dd.mm.yyyy hh:mm:ss
格式,但在Perl中我没有收到任何内容
我的数组包含这两个条目
foo 24.03.2014 19:18:57 foobar foo bar
bar 24.03.2014 15:19:00 asdfasrwe jlkj
这是我的Perl程序
use Try::Tiny;
foreach(@array)
{
try {
my ($day, $month, $year,$hours, $minutes, $seconds) = ($_ =~ m/(\d+)\.(\d+)\.(\d+) (\d+):(\d+):(\d+)/);
my $time= "$hours:$minutes:$seconds";
my $date= "$day.$month.$year";
} catch {
warn "caught error: $_";
};
print "Time: $time, Date: $date\n";
}
输出
Time: , Date:
Time: , Date:
与正则表达式教练一样,我的正则表达式已获批准,并且没有例外。我没有看到我的错误。问题在哪里?
答案 0 :(得分:6)
我的$ time'和我的$ date' try块的本地? 你可以在try块中打印这些值吗?
答案 1 :(得分:4)
如果您已将use strict
应用于您的程序,您会看到您正在打印的$time
和$date
变量尚未声明,因此不同于在try
块内定义。
总是 use strict
和use warnings
位于您编写的每个Perl程序的顶部。这是一个简单的措施,可以揭示许多这样的简单错误。
顺便说一句,try
块中没有任何内容可能导致致命错误,因此也可以在不使用Try::Tiny
模块的情况下编写。
use strict;
use warnings;
use Try::Tiny;
my @array = (
'foo 24.03.2014 19:18:57 foobar foo bar',
'bar 24.03.2014 15:19:00 asdfasrwe jlkj',
);
for (@array) {
my ($time, $date);
try {
my ($day, $month, $year, $hours, $minutes, $seconds) = /(\d+)\.(\d+)\.(\d+) (\d+):(\d+):(\d+)/;
$time = "$hours:$minutes:$seconds";
$date = "$day.$month.$year";
}
catch {
warn "caught error: $_";
};
print "Time: $time, Date: $date\n";
}
<强>输出强>
Time: 19:18:57, Date: 24.03.2014
Time: 15:19:00, Date: 24.03.2014
答案 2 :(得分:1)
已经说明的答案是在您制作的每个脚本的顶部加入use strict;
和use warnings
:Why use strict and warnings?
此外,您目前正在提取个人时间和日期信息,但随后将其丢弃以构建您的完整日期和时间。您可以跳过那里的一步,只需使用2个捕获组从一开始就提取日期和时间。
此外,您最终希望接触Time::Piece
以处理日期/时间:
use strict;
use warnings;
use Time::Piece;
my @array = (
'foo 24.03.2014 19:18:57 foobar foo bar',
'bar 24.03.2014 15:19:00 asdfasrwe jlkj',
);
for (@array) {
if (my ($date, $time) = $_ =~ m/(\d+\.\d+\.\d+) (\d+:\d+:\d+)/) {
print "Time: $time, Date: $date\n";
}
}
for (@array) {
if (/([\d.]{10} [\d:]{8})/) {
my $t = Time::Piece->strptime($1, "%d.%m.%Y %H:%M:%S");
print $t, "\n";
}
}