我尝试使用常规排版从文本文件中提取某些数字字符串,但是当我的代码运行时,它会在日期和时间之间的分隔中删除斜杠后的数字。这是我到目前为止所拥有的。
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
并且我的程序错误输出。
答案 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";
}
}