2

データ レコードは次のようになります。

  1aaaaaaaaaaaaaaa
  aaaaaaaaaaaaaaaa
  aaaaaaaaaaaaaaaa
  __Data__
  1bbbbbbbbbbbbbbb
  bbbbbbbbbbbbbbbb
  bbbbbbbbbbbbbbbb
  __Data__
  1ccccccccccccccc
  cccccccccccccccc
  cccccccccccccccc

パールコード:

 $/="__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

ファイルをセクションごとに処理したくなるかもしれませんが、この場合は行ごとに処理する方が明確に思えます。目的の出力は行単位であるためです。これにより、セクションを解析する必要がなくなります。

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

正規表現を変更して、目的のコンテンツを出力することができます。

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

各レコードで、これは上記のように最初の行と一致します。

于 2013-05-17T14:41:00.157 に答える
2

一行で:

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

ここで何度も言った考えを繰り返します: ラインはレコードの概念の実装の1 つにすぎません。これはデフォルトの実装ですが、唯一のものではありません。

  • レコードセパレータを"\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 に答える
0

1 つの解決策は、次のように、先頭のスペースを削除し、改行文字で分割し、最初の要素を出力することです。

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