- 締切済み
perlプログラム内で中間ファイルを利用するには
perlプログラムについて 処理1 の アウトプットデータを用いて、処理2を行うというのを1つのperlのプログラム内で実装したいと考えています。 処理1のアウトプットファイルの書き出しに時間がかかり 処理2が先に動き、ファイル読み込みできずに終わってしまいます。 処理1のアウトプットファイル書き出しが終了を待ってから、処理2を実施したいのですが、 どのように記載すればよいのでしょうか? 例) perl program.pl AAA > BBB program.pl 内 open(OUT1,"> program1_work"); open(ARG,$ARGV[0]); while(<ARG>){ 処理1 print OUT1 "XXXXXX"; } close(ARG); open(ARG1,OUT1); while(<ARG1>){ 処理2 print "XXXXXX"; } close(ARG1);
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「処理をわけて実装する」ときに, まさか open(ARG1,OUT1); なんて書いたりはしてないはずですけどね. で, #2 で言われていることに従って直したらどうなりました?
- Tacosan
- ベストアンサー率23% (3656/15482)
「処理をわけて実装する」ってのは, 具体的にはどうすることなんでしょうか?
- kmee
- ベストアンサー率55% (1857/3366)
> 処理1のアウトプットファイルの書き出しに時間がかかり 処理2が先に動き、ファイル読み込みできずに終わってしまいます。 その認識は間違いです。 perlでは、一部の処理を除いて、順番に処理します。 処理1が遅かったら、処理2が始まらないだけです。 処理1を待たずに処理2が始まる、などということはありません。 > open(ARG1,OUT1); これ、成功しているかどうか、確認してませんよね? openは失敗することの比較的多い処理です(ファイル名違いとか、権限不足とか) open(ARG1,OUT1) or die "$!" ; perlでよく使われる書き方で 「orの左が真ならばそのまま 偽ならor以降が評価される→dieでメッセージを主力してプログラムが終了」 となります。 ここで、openに失敗しているはずです。 openに失敗しているから、ARG1から何も読み込めず、while(<ARG1>)のループが1回も処理されていない、というのが現状です。 http://perldoc.jp/func/open > EXPR で与えられたファイル名のファイルを開き、FILEHANDLE と結び付けます。 とありますが、「open FILEHANDLE0, FILEHANDLE1 ; として、FILEHANDLE1が占めすファイルをFILEHANDLE0として開く」等とは、どこにも書いてません。 普通は次のような方法を使います。 (1) ファイル名を指定してopenする。 先にclose OUT1;する必要があるケースが多い。 (2) OUT1を +>等「読み書きモード」でopen。 書き込みが終ったらseekまたはrewindも先頭に戻って<OUT1>で読みこむ。 (3) データ量に対してメモリが十分にあるなら、リストにでも入れておく。 # print OUT1 "XXXXXX"; ではなく push @out1 , "XXXXXX" ; #と結果はリストに収める } close(ARG); # ここに@out1を出力する処理を書く # open(ARG1,OUT1); の必要無し # while(<ARG1>){ foreach (@out1) { 処理2 ...
お礼
やりかた ありがとうございます。 今度 記載のときに試してみます。
補足
書き込みに時間がかかっていると認識したのは、処理をわけて実装すると ただしく処理ができるからです。 でも、実際はほかのところで何か間違いがあるということなのでしょうか? その意味では、切り分けできていません。 連続して処理を実装すると、処理1結果ファイルはできていますが、そのあとの処理2ファイルは空ファイルで作成されていました。
- Tacosan
- ベストアンサー率23% (3656/15482)
確認だけど, 2つ目の open は open(ARG1,OUT1); でいいの? しかし, ここのハンドルはなんで ARG1 なんだろ. 引数関係ないのに.
補足
ARG1 は 引数関係ないので、どんな書き方でもいいです。 今 困っているのは、 処理1での出力結果program1_work ファイルを読み込んで 処理2を実施したいと考えているのですが。。。ファイル 書き出し途中で 処理2がスタートしてしまっているため、処理2がただしく処理されないのです。対応方法を教えてください
補足
処理1と 処理2 のプログラムをわけて perl program1.pl AAA の完了を 確認してから(時間をおいて)、下記の処理2 プログラムを起動 perl program2.pl program1_work > BBB というやり方にしています。 できれば 一度 目で完了していることを確認せず、処理2を実行したいのですが、