2012-07-25 184 views
2

我想匹配文件中的行并提取某个部分。 我的正则表达式可以与我所能找到的所有在线测试人员一起工作,但不能与我的Perl一起工作。 我在版本v5.10.0,无法更新。Perl正则表达式不匹配

正则表达式如下:

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+.+?\_.+$/) { 
+0

你如何设置'$ _ [0]'? – sergio 2012-07-25 15:42:46

+1

什么*你的正则表达式匹配?你可以交换'返回1美元'为'说$ 1'并且告诉我们测试输入的输出吗?请参阅下面的@ Bal的评论。 – amon 2012-07-25 20:42:43

+0

[适用于我!](http://codepad.org/o2nD2xJu)错误不在这里。显示你的整个代码**。 – daxim 2012-07-26 09:46:46

回答

2

测试:当$file不会在其仅最后一个字符串的情形中的任何位置包含一个0if ($file !~ "0") {是真实的。

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

除了这个你真的应该use strict;use warnings始终。

0

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

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

这没有帮助,不幸的是,相同的结果 – 2012-07-25 15:55:29

+2

如果你匹配以下内容后打印出“$ 1”会发生什么:'$ _ [0] =〜m/^ copy(。+)$/',然后 '$ _ [0] =〜m/^ copy \ s +(。+)$ /',那么 '$ _ [0] =〜m/^ copy \ s +。+(。+)$/'等,直到你找到你的模式出错的地方? – BaL 2012-07-25 16:50:18

0

我猜您的测试文件的最后一行是不以结束仅一个“\ n”。有趣的小辫子总是挡道.....

+0

这不是问题,我正在使用与它自己的每一行匹配的测试。 – 2012-07-25 15:44:34

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);  
    } 
}