数据记录如下所示:
1aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaa
__Data__
1bbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbb
__Data__
1ccccccccccccccc
cccccccccccccccc
cccccccccccccccc
Perl代码:
$/="__Data__";
open READFILE,"<","a_test.txt" or die "Unable to open file $file";
while(<READFILE>)
{
if(/^([^\n]*)\n([^\n]*)\n/sm)
{
print "$1\n";
}
}
close(READFILE);
此代码仅输出1aaaaaaaaaaaa
而不输出其他记录的第一行。我确定还有其他方法可以做到这一点,但使用这种代码格式,我怎样才能让其他记录只显示他们的第一行。理想的结果将是:
1aaaaaaaaaaaaaa
1bbbbbbbbbbbbbb
1cccccccccccccc
答案 0 :(得分:2)
您可以更改正则表达式以输出所需内容,
if (/ (.+) /x) { print "$1\n"; }
在每条记录中,这将与您在上面描述的第一行匹配。
答案 1 :(得分:2)
尽管逐段处理文件很有吸引力,但在这种情况下,逐行扫描似乎更为明确 - 因为所需的输出是面向行的。这样就无需解析各个部分。
my $marker = "__Data__\n";
my $flag = 1;
while (my $line = <>){
print $line if $flag;
$flag = $line eq $marker;
}
答案 2 :(得分:2)
在一行中:
$ perl -nle 'print; $_=<> until /^__Data__/ or eof' input.txt
答案 3 :(得分:0)
一种解决方案是删除前导空间,拆分换行符并打印第一个元素,如:
while(<READFILE>)
{
s/\A\s*//;
printf qq|%s\n|, (split /\n/)[0];
}
答案 4 :(得分:0)
我将重复一个我在这里多次说过的想法:一行只是记录概念的一个实现。它是默认实现,但它不是唯一的实现。
"\n__Data__\n"
只需打印从正则表达式中提取的所有非换行符:
use English qw<$RS>;
local $RS = "\n__Data__\n";
while ( <> ) { # A generic read
print /(.*)/, "\n";
}
因此,您将数据按记录分开,由__Data__
分隔,并仅拉出第一行。