- ベストアンサー
Perlで特定行から特定行までを抜き出したい
皆さんのお知恵をお貸し頂ければ幸いです。 Perlで以下のようなことをしたいと考えています。 例えば、次のようなテキストファイルがあったとします。 example.log ================================== aaaa hogehoge test okok perl script ================================== 上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。 イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。 このような場合、どういう風にすればいいのでしょうか? 恐れ入りますが、ご教授頂ければ幸いです。 それでは、どうぞよろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。 それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。) open FH, "example.log" or die $!; $flag = 0; while ($data = <FH>) { chomp $data; if ($data eq "hogehoge") { $flag = 1 } elsif ($data eq "perl") { $flag = 0 } elsif ($flag) { print "$data\n" } } close FH; で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^; open FH, "example.log" or die $!; while (<FH>) { print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/; } close FH; ※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。
その他の回答 (2)
- t140
- ベストアンサー率39% (59/150)
#Perlな人は .. 演算子を使ってこう書くかも知れません while (<IN>){ if ($_ eq "hogehoge\n" .. $_ eq "perl\n"){ print; } } #目的の位置まで読み飛ばして、目的の最後のキーワードが #見つかり次第ループを抜けるならこう書くこともできます 1 while <IN> eq "hogehoge\n"; while(<IN>){ print; $_ eq "perl\n" and last; } #もっとデータが大量にある場合に高速で抜き出すには #read関数を使って書くこともできますが、複雑なので #割愛します。
お礼
お世話になります。 こちらの内容でもいけるようです。 ただ、構文が理解出来ていない為、なぜ動くのがわからないのが難点です^^;; ともあれ、ありがとうございました。
- helonpa
- ベストアンサー率38% (108/278)
Perlな人はもっと略したいでしょうけど素直に書けば。 $flag=0; open(FH, "< ./example.log"); while($data = <FH>){ print "$data\n" if $flag==1; chomp $data; $flag=1 if $data eq "hogehoge"; $flag=0 if $data eq "perl"; } close FH;
お礼
ありがとうございました。 ご教授頂いた内容を少し弄りましたが、目的を達することが出来ました。
お礼
こちらもありがとうございます。 両方の方法で目的通りの動きをすることが確認出来ました。 ただ、後の方の構文はNo2さんが教えて下さったのと同様に、勉強不足の為なぜ動くのかがわかっていない次第です^^;