Perl正则表达式提取物

时间:2015-09-23 17:24:06

标签: perl

我尝试使用常规排版从文本文件中提取某些数字字符串,但是当我的代码运行时,它会在日期和时间之间的分隔中删除斜杠后的数字。这是我到目前为止所拥有的。

while ( <INFILE> ) {

    my @fields = split( /\ /, $_ );
    my @output;

    foreach my $field ( @fields ) {
        if ( $field =~ /[0-9]{5}\// ) {
            push @output, $field;
        }
    }

    if ( @output ) {
        my $line = join( ' ', @output );
        print "$line\n";
        print OUTFILE "$line\n";
    }
}

我尝试从中提取数据的行是

D2001235 9204 254/2004 254/1944 254/2041 15254/2011 ALL-V4YM 001 AUTO C-C0000

我需要的数据是15254,但是当我运行我的代码时,它返回15254/2011并且我的程序错误输出。

2 个答案:

答案 0 :(得分:4)

问题是您将整个$field存储在输出数组中,但您只希望存储斜杠左侧的数字。您可以在正则表达式和$1特殊变量中使用捕获括号。这会输出15254

use warnings;
use strict;

while (<DATA>) {
    my @fields = split( /\ /, $_ );
    my @output;
    foreach my $field (@fields) {
        if ( $field =~ /^([0-9]{5})\// ) {
            push @output, $1;
        }
    }
    if (@output) {
        my $line = join( ' ', @output );
        print "$line\n";
    }
}

__DATA__
D2001235 9204 254/2004 254/1944 254/2041 15254/2011 ALL-V4YM 001 AUTO C-C0000

答案 1 :(得分:1)

如上所述,如果整个字段与正则表达式匹配,则保存在@output中,而不仅仅是斜杠之前的第一部分

您的split也不必要地复杂化,并且join不是必需的

你需要的就是这个

while ( <INFILE> ) {

    my @output = map m{^([0-9]{5})/}, split;

    if ( @output ) {
        print "@output\n";
        print OUTFILE "@output\n";
    }
}