制限が正確ではないため、質問は難しいです。ブロックは次のように見えるべきだとあなたは言います - 私が思うに -
foo,
bar,
baz)
ブロックを開始する文字列はどこfoo
にあり、閉じ括弧はブロックを終了します。ただし、次のように言うこともできます。
foo bar baz) xxxxxxxxxxx,
そして、行がカンマで終わる IFまでのみ印刷)
したいのです。foo bar baz)
また、カンマで終わる行のみを継続する必要があると言っている可能性もあります。
foo, # print + is continued
bar # print + is not continued
xxxxx # ignored line
foo # print + is not continued
foo,
bar,
baz) # closing parens also end block
あなたが最初の選択肢を意味しているとしか推測できないので、2つのオプションを示します。
use strict;
use warnings;
sub flip {
while (<DATA>) {
print if /^foo/ .. /\)\s*$/;
}
}
sub ifchain {
my ($foo, $print);
while (<DATA>) {
if (/^foo/) {
$foo = 1; # start block
print;
} elsif ($foo) {
if (/,\s*$/) {
print;
} elsif (/\)\s*$/) {
$foo = 0; # end block
print;
}
# for catching input errors:
else { chomp; warn "Mismatched line '$_'" }
}
}
}
__DATA__
foo1,
bar,
baz)
sadsdasdasdasd,
asda
adaffssd
foo2,
two,
three)
yada
最初のものは、 で始まるfoo
行と で終わる行の間にある行を出力し)
ます。「カンマで終わる行」の制限は無視されます。良い面としては、次のように単純化できます。
perl -ne 'print if /^foo/ .. /\)\s*$/' file.txt
2 つ目は、両方の制限を考慮し、両方に一致しないブロック内の行が見つかった場合に警告する (STDERR に出力する) 単純化された if 構造です。