【问题标题】:Regex seems valid but doesn't work in Perl正则表达式似乎有效但在 Perl 中不起作用
【发布时间】:2014-03-26 05:48:17
【问题描述】:

我有正则表达式教练验证的以下正则表达式

(\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

【问题讨论】:

  • 始终使用use strict; use warnings;!!!
  • 那个try 块有点没用。它不包含任何可能die.
  • 使用严格;使用警告; > 现在我收到了更多信息,你的!

标签: regex perl


【解决方案1】:

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

【讨论】:

  • 似乎我遇到了一个糟糕的范围界定问题。你给我指出了正确的方向!谢谢
【解决方案2】:

如果您将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

【讨论】:

    【解决方案3】:

    如前所述,答案是将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";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      相关资源
      最近更新 更多