逐行匹配文件

时间:2017-07-10 12:54:32

标签: regex perl for-loop grep pattern-matching

$text_file = '/homedir/report';
open ( $DATA,$text_file ) || die "Error!";   #open the file
@ICC2_array = <$DATA>;

$total_line = scalar@ICC2_array;    # total number of lines

@address_array = split('\n',$address[6608]);  # The first content is what I want and it is correct, I have checked using print

LABEL2:
for ( $count=0; $count < $total_line; $count++ ) {

    if ( grep { $_ eq "$address_array[0]" } $ICC2_array[$count] ) {
        print "This address is found!\n";
        last LABEL2;
    }
    elsif ( $count == $total_line - 1 ) {  # if not found in all lines
        print "No matching is found for this address\n";
        last LABEL2;
    }
}

我试图逐行匹配@ICC2_array中的第6609个地址。我确定此地址位于$text_file,但格式完全相同。

这样的事情:

$address[6608]包含

Startpoint: port/start/input_output (triggered by clock3)
Endpoint: port/end/input_output (rising edge-triggered)

$address_array[0]包含

Startpoint: port/start/input_output (triggered by clock3)

$text_file中的一行是

Startpoint: port/start/input_output (triggered by clock3)

然而输出是"no matching found for this address",有人可以指出我的错误吗?

2 个答案:

答案 0 :(得分:1)

@ICC2_array中的所有元素最后都会包含换行符。

由于$address_array[0]是通过在\n上拆分数据创建的,因此保证不会包含换行符。

以换行符结尾的字符串永远不能等于不包含换行符的字符串。

我建议更换:

@ICC2_array = <$DATA>;

使用:

chomp(@ICC2_array = <$DATA>);

更新:我刚刚发现的另一个问题。您在每次迭代时递增$count两次。您可以在循环控制代码($count++)中递增它,并且还在else子句($count += 1)中递增它。因此,您可能只检查@ICC2_array中的所有其他元素。

答案 1 :(得分:1)

我认为你的代码应该是这样的

来自核心模块any的{​​{1}}运算符与List::Util类似,只是它会在找到匹配后立即停止搜索,因此平均应该快两倍。 grep的早期迭代不包含List::Util,如果适用于您,您只需使用any

我已从您的数组标识符中删除了grep,因为_array表示它是一个数组而且只是不需要的噪音

@