如何使用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";
}