電子書籍の厳選無料作品が豊富!

perlを使用して指定した先頭文字がヒットした行から
別に指定した先頭文字がヒットする一行前までを
切り出したいと思っています。

[例]
【変換前】
aa bb cc dd
ab bc cd de
ac bd de ef
ad bd de ef
ad bc cd ef
ae bc cd df

【変換後】
ab bc cd de
ac bd de ef

変換内容は上記の例ですと先頭文字がabから始まる行から
先頭文字がadで始まる行の1行前までを抜き出したいと思っています。
この場合どのようにPerlで記述をしてあげればよいか教えて頂けないでしょうか。

よろしくお願いいたします。

A 回答 (2件)

この手の問題は、No.1さんのようにフリップフロップ演算子(リストコンテキストでは範囲演算子)を使うのが常套です。



フリップフロップ演算子を使えば、以下のように状態を記憶させておく変数($in_scope)が不必要になります。(Perl自身が状態を記憶しておいてくれるから)

my $in_scope;

while ( <DATA> ) {
last if $in_scope and /^ad/;
$in_scope = 1 if /^ab/;
print if $in_scope;
}

切り出したい部分が1ヶ所以上ある場合は、以下のように書けば、何度もフリップフロップしてくれます。

while ( <DATA> ) {
print if /^ab/ .. /^ad/ and !/^ad/;
}
    • good
    • 0

以下、表示がくずれるので空白2文字を全角の空白にしていることに注意



use strict;
use warnings;

my @out = ();

LOOP_DATA:
while (<DATA>) {
  if ( m/^ab/ .. m/^ad/ ) {
    last LOOP_DATA if m/^ad/;
    push @out, $_;
  }
}

print @out;

__DATA__
aa bb cc dd
ab bc cd de
ac bd de ef
ad bd de ef
ad bc cd ef
ae bc cd df
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!