0

以下に示すように、Test.txt ファイルがあります。

some data1 func-name1 SECTION.
data to be extracted
data to be extracted
some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

ここで、フリップフロップ演算子を使用して範囲を抽出しています。ここで、START= SECTION. および END= -EXIT。出口。以下のように:

open FILE1, "<Test.txt" 
    or die "Cannot open File1.txt!";

open FINAL, ">Final.txt" 
    or die "Cannot open Finall.txt!";

my $START = 'SECTION.';
my $END   = '-EXIT EXIT.';

while (<FILE1>) {
    if (/$START/ .. /$END|$START/) {

        if ($_ =~ m/$END|$START/) {
            $flag = 1;
        }

        print FINAL $_;

        if ($flag == 1) {          
            print FINAL "\n\n";
            $flag = 0;
        }
    }
}
close FINAL;
close FILE1; 

私がやろうとしているのは、SECTION 間の区切り文字として次の 2 行が必要だということです。範囲もあり、Final.txt は次のようになります。

some data1 func-name1 SECTION.
data to be extracted
data to be extracted


some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

これについて私を案内してください。

4

1 に答える 1

1

そのためにフリップフロップは必要ありません:

#!/usr/bin/env perl
use strict;
use warnings;

my $first = 0;

while (<DATA>) {
    print /SECTION/ && $first++ ? "\n\n$_" : $_;
}

__DATA__
some data1 func-name1 SECTION.
data to be extracted
data to be extracted
some data2 func-name2 SECTION.
data to be extracted
data to be extracted
func-name2-EXIT. EXIT.

$first最初のセクションの前に改行が挿入されていないことを確認するためにセクションをカウントしますが、最初のセクションが1行目から始まる場合は、特殊変数を使用して。$.に置き換えることができます。$first++$. > 1

式の最初の部分は、/SECTION/ && $first++すべての行に対して評価されます。/SECTION/は省略形です$_ =~ /SECTION/。これは、文字列SECTIONが見つからない場合、行がそのまま印刷されることを意味します($_)。

SECTION見つかった場合$first++は評価されます。後置インクリメントが使用されるのは、最初のセクションを( )$firstに評価して、そのまま印刷し()、2つの改行が後続のセクション()にのみ追加されるようにするためです。0false$_"\n\n$_"

于 2012-09-19T05:27:38.467 に答える