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
块有点没用。它不包含任何可能死亡的内容;使用警告;>现在我收到了更多的信息,你的!看来我最终陷入了一个糟糕的范围界定问题。你给我指明了正确的方向!非常感谢。