如何使用perl获取每个数据记录的第一行?
数据记录如下所示:如何使用perl获取每个数据记录的第一行?,perl,Perl,数据记录如下所示: 1aaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaa __Data__ 1bbbbbbbbbbbbbbb bbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbb __Data__ 1ccccccccccccccc cccccccccccccccc cccccccccccccccc Perl代码: $/="__Data__"; open READFILE,"<"
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);
您可以更改正则表达式以输出所需的内容
if (/ (.+) /x) { print "$1\n"; }
在每个记录中,这将与上面描述的第一行相匹配。尽管逐节处理文件很有诱惑力,但在这种情况下,逐行处理似乎更为清晰,因为所需的输出是面向行的。这样就不需要解析这些部分
my $marker = "__Data__\n";
my $flag = 1;
while (my $line = <>){
print $line if $flag;
$flag = $line eq $marker;
}
my$marker=“\uuuuu数据\uuuu\n”;
我的$flag=1;
while(我的$line=){
如果$flag,则打印$line;
$flag=$line eq$标记;
}
一种解决方案是用空格删除前导,用换行符拆分并打印第一个元素,如:
while(<READFILE>)
{
s/\A\s*//;
printf qq|%s\n|, (split /\n/)[0];
}
while()
{
s/\A\s*/;
printf qq |%s\n |,(拆分/\n/)[0];
}
在一行中:
$ perl -nle 'print; $_=<> until /^__Data__/ or eof' input.txt
$perl-nle'打印;$\直到/^\uuuuuuuuuuuuu数据或eof'input.txt
我将重复我在这里多次说过的一个想法:行只是记录概念的一个实现。它是默认的实现,但不是唯一的实现
- 将记录分隔符设置为
“\n\u\u数据\u\n”
- 只需打印从正则表达式中提取的所有非换行符:
use English qw<$RS>; local $RS = "\n__Data__\n"; while ( <> ) { # A generic read print /(.*)/, "\n"; }
使用英语qw; 本地$RS=“\n\u\u数据\u\n”; 而(){#则是一种泛型读取 打印/(.*)/,“\n”; }
因此,您可以按记录将数据拆分,并以
\uuuu data\uuuu
分隔,然后仅拉出第一行 有人能告诉我为什么我的代码不起作用吗?默认情况下,它似乎应该
与\n
不匹配,因此它与您的第一次捕获非常相似。@user1937198不会,只是第一行,因为没有/s修饰符。按预期工作,只需更改regex即可。$\现在还可以。不是惯用的解决方案,而是显示出对命令行的深刻了解。
use English qw<$RS>;
local $RS = "\n__Data__\n";
while ( <> ) { # A generic read
print /(.*)/, "\n";
}