• ベストアンサー

Perlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。 Perlで以下のようなことをしたいと考えています。 例えば、次のようなテキストファイルがあったとします。 example.log ================================== aaaa hogehoge test okok perl script ================================== 上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。 イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。 このような場合、どういう風にすればいいのでしょうか? 恐れ入りますが、ご教授頂ければ幸いです。 それでは、どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.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; ※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

edaeda8765
質問者

お礼

こちらもありがとうございます。 両方の方法で目的通りの動きをすることが確認出来ました。 ただ、後の方の構文はNo2さんが教えて下さったのと同様に、勉強不足の為なぜ動くのかがわかっていない次第です^^;

その他の回答 (2)

  • t140
  • ベストアンサー率39% (59/150)
回答No.2

#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関数を使って書くこともできますが、複雑なので #割愛します。

edaeda8765
質問者

お礼

お世話になります。 こちらの内容でもいけるようです。 ただ、構文が理解出来ていない為、なぜ動くのがわからないのが難点です^^;; ともあれ、ありがとうございました。

  • helonpa
  • ベストアンサー率38% (108/278)
回答No.1

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;

参考URL:
http://www.rfs.jp/sitebuilder/perl/
edaeda8765
質問者

お礼

ありがとうございました。 ご教授頂いた内容を少し弄りましたが、目的を達することが出来ました。

関連するQ&A

専門家に質問してみよう