2

数据记录如下所示:

  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
4

5 回答 5

2

您可以更改您的正则表达式以输出所需的内容,

if (/ (.+) /x) { print "$1\n"; }

在每条记录中,这将与上述第一行匹配。

于 2013-05-17T14:41:00.157 回答
2

尽管逐段处理文件很诱人,但在这种情况下,逐行处理似乎更明确——因为所需的输出是面向行的。这避免了解析这些部分的需要。

my $marker = "__Data__\n";
my $flag   = 1;

while (my $line = <>){
    print $line if $flag;
    $flag = $line eq $marker;
}
于 2013-05-17T14:45:38.367 回答
2

在一行中:

$ perl -nle 'print; $_=<> until /^__Data__/ or eof' input.txt
于 2013-05-17T16:54:55.707 回答
0

一种解决方案是删除前导 withespace,拆分换行符并打印第一个元素,例如:

while(<READFILE>)
{           
    s/\A\s*//;
    printf qq|%s\n|, (split /\n/)[0];
}
于 2013-05-17T14:45:38.190 回答
0

我将在这里重复我多次说过的一个想法:一行只是记录概念的一种实现。它是默认实现,但不是唯一的。

  • 记录分隔符设置为"\n__Data__\n"
  • 只需打印从正则表达式中提取的所有非换行符:

    use English qw<$RS>;
    local $RS = "\n__Data__\n";
    
    while ( <> ) { # A generic read
        print /(.*)/, "\n";
    }
    

因此,您按记录拆分数据,由第一行分隔__Data__并仅提取第一行。

于 2013-05-17T17:49:59.013 回答