
皆さんのお知恵をお貸し頂ければ幸いです。
Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。
example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================
上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。
このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。
それでは、どうぞよろしくお願い致します。
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;
※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。
こちらもありがとうございます。
両方の方法で目的通りの動きをすることが確認出来ました。
ただ、後の方の構文はNo2さんが教えて下さったのと同様に、勉強不足の為なぜ動くのかがわかっていない次第です^^;
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関数を使って書くこともできますが、複雑なので
#割愛します。
お世話になります。
こちらの内容でもいけるようです。
ただ、構文が理解出来ていない為、なぜ動くのがわからないのが難点です^^;;
ともあれ、ありがとうございました。
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/
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlのプログラミング 部分入れ...
-
Perlでファイルの末尾から指定...
-
テキストファイルで提出とは?
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
FTP接続時失敗時、接続先名をcs...
-
Perlの初心者です。2重ループ...
-
MATLAB std::exceptionエラー
-
BBCode削除&改行をサニタイジ...
-
CSVファイルのデータの行数を取...
-
パイソンでCSVファイル場所を指...
-
perl:パターンマッチを使ったif...
-
perlでファイルの比較
-
書き込み時に勝手にクリアさせ...
-
Argument "\\\\n" isn't numeri...
-
先頭の単語が一致した時のデー...
-
郵便番号辞書のアップデート手...
-
Perlでの重複要素カウントにつ...
-
pealを用いたcsvファイルの抽出
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
awkスクリプトでダブルクォーテ...
-
batファイルでrenameができませ...
おすすめ情報