プロが教えるわが家の防犯対策術!

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

A 回答 (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;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/06/18 20:28

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

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

お礼日時:2005/06/18 20:25

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/
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/06/18 20:23

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A