
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);
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
「処理をわけて実装する」ときに, まさか
open(ARG1,OUT1);
なんて書いたりはしてないはずですけどね.
で, #2 で言われていることに従って直したらどうなりました?
No.3
- 回答日時:
「処理をわけて実装する」ってのは, 具体的にはどうすることなんでしょうか?
この回答への補足
処理1と 処理2 のプログラムをわけて
perl program1.pl AAA
の完了を 確認してから(時間をおいて)、下記の処理2 プログラムを起動
perl program2.pl program1_work > BBB
というやり方にしています。
できれば 一度 目で完了していることを確認せず、処理2を実行したいのですが、
No.2
- 回答日時:
> 処理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ファイルは空ファイルで作成されていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- Ruby プログラミング 3 2023/06/09 14:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlの基礎中の基礎を教え...
-
VB6で、長い時間かかる処理...
-
{ ; }とは、どういう意味?
-
実行中の変数の中身をイミディ...
-
ページングで「前の○件」の方法
-
C言語のプログラミング
-
何がいけないのでしょうか?
-
ソートを利用して文字を昇順で...
-
お勧めのデバッグツールは?
-
__DATA__ が上書きされてしまう
-
Perl・正規表現が分かりません
-
EUCで保存されたスクリプトにて...
-
Pythonのプログラミング(Tkinter)
-
Application.ScreenUpdating = ...
-
文字の横にプルダウンを表示さ...
-
@×× = $q->param('**'); の書...
-
ファイルに書き込む
-
perlの型と8進数、10進数
-
JSONで文字列が長い時
-
FindFirst を複数条件で検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6で、長い時間かかる処理...
-
実行中の変数の中身をイミディ...
-
初回起動のみ判別したい
-
C言語のflagの使い方が分かりま...
-
処理終了後、他のページへジャ...
-
C#でDataFridViewの行をすべて...
-
回数を指定しないで空白行まで...
-
SetDlgItemInt( ) c++
-
perl:ループのカウンタ変数の値...
-
問題作成のWebアプリの作り方を...
-
UWSC SLCTBOXもしくはSELECTに...
-
STDINによるキーボードからの入...
-
Pythonでこのプログラミングを...
-
VBAのCallステートメントについて
-
Valueの値によってActionの送信...
-
フラグをたてる、、の意味を教...
-
C言語のプログラミング
-
arduino の割り込み処理について
-
教えてください。 画像処理のプ...
-
スカラー変数に処理を入れる
おすすめ情報