1

重複の可能性:
Perl でループから抜け出すにはどうすればよいですか?

以下のようなデータがあります。選択したテキストをキャプチャする perl スクリプトを作成しようとしています。それについての私の考えは、「前の行の読み取りがすべて-であり、現在の行の読み取りがすべて=である場合、ファイルの読み取りを停止し、=と-のみでそれらの行を印刷しないでください。 .

ただし、それをコーディングする方法がわかりません。私は3日前にperlを使い始めました。それが最善の方法かどうかはわかりません。より良い方法があれば教えてください。いずれにせよ、コードを手伝っていただければ幸いです。

これまでの私のコード:

...
$end_section_flag = "true" # I was going to use this to signify 
                           # when I want to stop reading
                           # ie. when I reached the end of the
                           # data I want to capture

while (<$in-fh>)
{
    my $line = $_;
    chomp $line;

    if ($line eq $string)
    {
        print "Found it\n";
        $end_section_flag = "false";
    }

    if ($end_section_flag eq "false" )
    {
        print $out-fh "$line\n";
        // if you found the end of the section i'm reading
        // don't pring the -'s and ='s and exit
    }
}

私のデータがどのように見えるか

-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
asdfsad
fasd
fas
df
asdf
a
\n
\n
-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
...

撮りたいもの

-------------------------------------------------------------------------------
===============================================================================
BLAH BLAH
===============================================================================
asdfsad
fasd
fas
df
asdf
a
\n
\n
4

2 に答える 2

1

境界が行末と交差するため、行単位の処理はあまり適していません。ファイル全体を丸呑みしてから、一致演算子で中間を抽出します。

use strictures;
use File::Slurp qw(read_file);
my $content = read_file 'so11454427.txt', { binmode => ':raw' };
my $boundary = qr'-{79} \R ={79}'msx;
my (@extract) = $content =~ /$boundary (.*?) $boundary/gmsx;
于 2012-07-12T15:12:28.947 に答える
0

これがニーズに合っているかどうかを確認してください:

 perl -ne 'm/^---/...m?/---/ and print' file

最初のブロックのみが必要な場合は、区切り文字/を次のように変更し?ます。

 perl -ne 'm?^---?...m?^---? and print' file

範囲演算子の説明を参照してください。

これにより、「---」で区切られた行の範囲が出力されます。シェルのリダイレクトを使用して、選択したファイルに出力をリダイレクトできます。

perl -ne 'm/^---/...m?/---/ and print' file > myoutput
于 2012-07-12T15:17:04.017 に答える