2

我正在尝试匹配文件中的行并提取某个部分。我的正则表达式适用于我能找到的所有在线测试人员,但不适用于我的 perl。我使用的是 v5.10.0 版本,无法更新。

正则表达式如下所示:

sub parse_bl_line {
    if ($_[0] =~ m/^copy\s+.*?\s+(.*?\_.*)/) {
             return $1;
    } else {
             log_msg("Line discarded: $_[0]", 4);
     return "0";
    }

}

几行应该匹配的测试数据(只有最后一个匹配):

@bl_lines = (
"copy xxxxxx_/cpu     b_relCAP_R3.0-1_INT5_xxxxx_cpu_p1",
"copy xxxxxxxx_/va_xxx_parameters    b_relCAP_R3.0-1_INT5_xxxxx_va_xxx_parameters_p1",
"copy xxxxxxxx_/xxxxxxx_view.tcl      b_relCAP_R3.0-1_INT5_xxxxxx_view.tcl_p0",
"copy xxxxx_/xxxxxarchivetool.jar   b_relEARLY_DROP1_xxxxxarchivetool.jar_xx");

并调用函数:

foreach(@bl_lines) {
    $file=parse_bl_line($_);
    if ($file !~ "0") {
            log_msg("Line accepted: $_", 4);
            log_msg("File extracted: $file", 4);
    }else { 
            log_msg("Line rejected: $_", 2);
    }

}

我正在尝试匹配最后一部分,例如

b_relEARLY_DROP1_xxxxxarchivetool.jar_xx

输出如下所示:

20120726 13:15:34 - [XXX] ERROR: Line rejected: copy xxxxxx_/cpu     b_relCAP_R3.0-1_INT5_xxxxx_cpu_p1
20120726 13:15:34 - [XXX] ERROR: Line rejected: copy xxxxxxxx_/va_xxx_parameters    b_relCAP_R3.0-1_INT5_xxxxx_va_xxx_parameters_p1
20120726 13:15:34 - [XXX] ERROR: Line rejected: copy xxxxxxxx_/xxxxxxx_view.tcl      b_relCAP_R3.0-1_INT5_xxxxxx_view.tcl_p0
20120726 13:15:35 - [XXX] INFO: Line accepted: copy xxxxx_/xxxxxarchivetool.jar   b_relEARLY_DROP1_xxxxxarchivetool.jar_xx 
20120726 13:15:35 - [XXX] INFO: File extracted: b_relEARLY_DROP1_xxxxxarchivetool.jar_xx

提示 我做了一些@BaL 提议的测试,发现模式匹配在没有选择括号的情况下工作。

if ($_[0] =~ m/^copy\s+.+?\s+.+?\_.+$/) {
4

4 回答 4

2

测试 : 在任何位置都不包含 aif ($file !~ "0") {时为真,这仅是最后一个字符串的情况。$file0

我猜你想使用:if ($file ne '0') {甚至更短:if ($file) {

use strict;除此之外, 您应该use warnings始终如此。

于 2012-07-27T12:24:04.783 回答
0

你想匹配什么?最后一部分?不要使用 * 如果你知道你有匹配的东西,使用 + 代替:

if ($_[0] =~ m/^copy\s+.+?\s+(.\+?)$/) {
    return $1;
}
于 2012-07-25T15:39:37.927 回答
0

我猜你的测试文件的最后一行是唯一不以“\n”结尾的。有趣的小虫子总是挡道......

于 2012-07-25T15:42:27.227 回答
0

在进行字符串比较时,将 if 语句中的比较运算符从 !~ 更改为 ne。当我进行此更改时,所有日志行都被接受。

我在 perl 5.14.2 而不是 5.10 上对此进行了测试,但我没有使用任何特殊功能。搏一搏!代码如下:

use 5.14.2;

sub log_msg{
    say shift;  
}

sub parse_bl_line {
    if ($_[0] =~ m/^copy\s+.*?\s+(.*?\_.*)/) {             
        return $1;     
    }
    else {              
        log_msg("Line discarded: $_[0]", 4);      
        return "0";     
    }
}

my @bl_lines = ( 
    "copy xxxxxx_/cpu                    b_relCAP_R3.0-1_INT5_xxxxx_cpu_p1",
    "copy xxxxxxxx_/va_xxx_parameters    b_relCAP_R3.0-1_INT5_xxxxx_va_xxx_parameters_p1", 
    "copy xxxxxxxx_/xxxxxxx_view.tcl     b_relCAP_R3.0-1_INT5_xxxxxx_view.tcl_p0", 
    "copy xxxxx_/xxxxxarchivetool.jar    b_relEARLY_DROP1_xxxxxarchivetool.jar_xx"
);  

foreach(@bl_lines) {     
    my $file = parse_bl_line($_);     
    if ($file ne "0") {    # Changed the comparison operator here         
        log_msg("Line accepted: $_", 4);             
        log_msg("File extracted: $file", 4);
    }
    else {              
        log_msg("Line rejected: $_", 2);     
    } 
}

于 2012-07-27T11:49:33.620 回答