正则表达式似乎有效,但在Perl中不起作用

时间:2014-03-25 16:32:52

标签: 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 {
        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: 

与正则表达式教练一样,我的正则表达式已获批准,并且没有例外。我没有看到我的错误。问题在哪里?

on regex101 - it seems legitimate

3 个答案:

答案 0 :(得分:6)

我的$ time'和我的$ date' try块的本地? 你可以在try块中打印这些值吗?

答案 1 :(得分:4)

如果您已将use strict应用于您的程序,您会看到您正在打印的$time$date变量尚未声明,因此不同于在try块内定义。

总是 use strictuse 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 warningsWhy 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";
    }
}