アプリ版:「スタンプのみでお礼する」機能のリリースについて

perlを用いた特定文字列間の抽出方法について

下記のテキストファイル、test1.logからstart〜end間を抽出するpealを作ろうと思っています。

$datafile="test1.log";
open(FH, $datafile);

@list = <FH>;

while (<FH>) {
'print if /^start$/ .. /^end$/';
}

ですが、実行してもエラーにはなりませんが何も出力されません。
どこに問題があるのかが分かりません。
最終的にはカレントディレクトリにある複数のtest1.logと同様の.logファイルを
一括で処理したいと思っています。

test1.logファイルの内容
start
aaa
bbb
ccc
end
eee
fff
ggg

分かる方がいらっしゃいましたら、お知恵をお借りしたくよろしくお願いいたします。

質問者からの補足コメント

  • HAPPY

    my $datafile = $ARGV[0];
    open(FH, $datafile) or die("error :$!");
    while ( $_ = 〈FH〉) {
    print $_ if /^start$/ .. /^end$/;

    close(FH);

    ありがとうございます。
    (3)の方法を元にファイル名を引数として標準出力で
    別ファイルとして保存することまで出来ました。
    あとはこれをベースにしてカレントディレクトリの
    拡張子logの複数ファイルを一括処理出来るよう改良
    したいと思います。

    test.pl test1.log 〉 test1.txt

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/09/18 21:56

A 回答 (1件)

> @list = <FH>; # ファイルポインタがファイルの末尾に移動



> while (<FH>) { # ポインタがファイルの末尾なのでループを実行せずに終了
>  print if /^start$/ .. /^end$/;
> }

ファイルの読み取りは1度だけですので、再オープンするか、読み取った @list を利用するなどが必要です。

(1) ファイルの再オープン
@list = <FH>;
open FH, $datafile or die;
while (<FH>) {

(2) @list の利用
@list = <FH>;
while ($_ = shift @list) {

(3) @list の作成を止める
# @list = <FH>;
while (<FH>) {
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。
おかげさまで目的を果たすことができました。

お礼日時:2016/09/22 14:56

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