Regex 正则表达式似乎有效,但不';我不能用Perl工作
我有下面的正则表达式由正则表达式教练验证Regex 正则表达式似乎有效,但不';我不能用Perl工作,regex,perl,Regex,Perl,我有下面的正则表达式由正则表达式教练验证 (\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 {
(\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:
与regex coach一样,我的regex已获得批准,并且没有显示任何异常。我看不出我的错误。问题在哪里
对于try块,“我的$time”和“我的$date”是本地的吗?
您可以从try块中打印值吗?如果您将
使用strict
应用到您的程序中,您将看到您正在打印的$time
和$date
变量尚未声明,因此与try
块中定义的变量不同
请在您编写的每个Perl程序的顶部始终使用strict
和使用warnings
。这是一个简单的措施,将揭示许多像这样的简单错误
顺便说一句,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
如前所述,答案是在您制作的每个脚本的顶部包括: 此外,您目前正在提取个人时间和日期信息,但随后将其丢弃以构建完整的日期和时间。您可以跳过其中的一个步骤,只需使用两个捕获组即可从一开始提取日期和时间 此外,您最终会希望接触到以下内容,以便使用日期/时间:
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";
}
}
始终使用
严格使用;使用警告代码>!!!那个try
块有点没用。它不包含任何可能死亡的内容;使用警告;>现在我收到了更多的信息,你的!看来我最终陷入了一个糟糕的范围界定问题。你给我指明了正确的方向!非常感谢。