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

初心者で至らぬ点が多々有りますが、宜しくお願いします。
環境はWindows7-64bit、ActivePerl 5.12.4 Build(64bit)を使用しています。
テキストが数百個有り、全て以下のような構成になっています。

文章1
文章2
文章3
kwd
文章4
kwd
文章5
文章6
kwd
   ~以下略~

ファイル郡をリストとして読み込み、それぞれのファイルに対して
kwdをキーとして検索し、該当した行の上の行を抽出しようとしています。

~ファイルリスト読み込みルーチンは省略、以下各ファイル毎のサブルーチン~

sub execute {
open(INP, "$inp"); #ファイル読み込み
open(OUT, ">rep\\$inp"); #ファイル書き出し(フォルダを変えて同名)

while(<IN>){
if($_ =~ m/kwd/){ #現在の行が"kwd"を含んでいたら
print OUT $prev; #前の行を抽出のつもり
}
$prev = $_; #現在の行データを$prevに格納
}
close(INP);
close(OUT);
}

$_には現在の行データが入っていると認識しており
上記の書き方で$prevには一段上の行データが入るのでは
と思ったのですが、現状$prevを出力してもカラです。

文法ミスよりも、そもそも考え方が間違っているような気がして
なりませんが、どうか解決法を教えて頂きたく。

A 回答 (5件)

りょ~かい.



でも, そうするとスクリプト全体とか使ったデータとかを見たいなぁ.
    • good
    • 1

サブルーチンを呼び出す側を想定してみたのが、


以下のスクリプトですが、スクリプトと同一フォルダにある
"input.txt"を使った限りでは正常に実行できています。

$input = "input.txt";
execute($input);

sub execute {
my ($inp) = @_;
open(INP, "$inp"); #ファイル読み込み
open(OUT, ">rep\\$inp"); #ファイル書き出し(フォルダを変えて同名)

while(<INP>) {
  if($_ =~ m/kwd/) { #現在の行が"kwd"を含んでいたら
    print OUT $prev; #前の行を抽出のつもり
  }
  $prev = $_; #現在の行データを$prevに格納
}
close(INP);
close(OUT);
}

※サブルーチン側の問題でないとすると、サブルーチンの呼び出し側に問題があるのかもしれません。
 「ファイル群をリストとして読み込み、」で、サブルーチンへのファイル名の引き渡しを
 どのように行っているか、具体的に示していただけないでしょうか?
    • good
    • 0

openがINPで、whileがINと コーディングミスしているだけの問題で


考え方は問題ないのでは。

この回答への補足

申し訳ありません。
ファイルハンドルに関しては投稿時の
推敲中に誤って消してしまったようです。
実際のファイルハンドルは同名です。

補足日時:2011/11/17 10:00
    • good
    • 1

 openでは、ファイルハンドルを"INP"としているのに、


入力するときは、"while(<IN>)"と異なったファイルハンドルに
しているので、入力データは何もないことになり、結果として
出力データ(ここでは$prev)には何も出てこないことになります。

 したがって、"open(IN, "$inp"); #ファイル読み込み"とするか、
"while(<INP>)"と変更すれば、出力データも出力されます。

この回答への補足

申し訳ありません。
ファイルハンドルに関しては投稿時の
推敲中に誤って消してしまったようです。
実際のファイルハンドルは同名です。

補足日時:2011/11/17 09:58
    • good
    • 0

「IN」というファイルハンドルは開けてないから, エラーになるかループが回らないかのどちらかのような気がするんだけど....



さておき, 「現状$prevを出力してもカラです」というのは
・どのように調べて
・どうなった結果
そう判断したのでしょうか?

この回答への補足

申し訳ありません。
ファイルハンドルに関しては投稿時の
推敲中に誤って消してしまったようです。
実際のファイルハンドルは同名です。

> >さておき, 「現状$prevを出力してもカラです」というのは~
に関してですが、出力したtxtの中身を見ての判断でしたが
正しくは「出力したtxtの中身は改行だけだった」です。
全く意味合いが違ってきますね・・・重ねて申し訳ありません。
なお改行数は、抽出元ファイル内部のkwd数と同数でした。

補足日時:2011/11/17 09:57
    • good
    • 0

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