
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6で、長い時間かかる処理...
-
C言語のflagの使い方が分かりま...
-
実行中の変数の中身をイミディ...
-
SetDlgItemInt( ) c++
-
UWSC SLCTBOXもしくはSELECTに...
-
arduino の割り込み処理について
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
「型が一致しません」のエラー...
-
メモリをアドレスを直接指定し...
-
formで特定のinputを送信しない...
-
複数列を持ったリストボックス...
-
テーブル内でドロップダウンメ...
-
セレクトメニューで2つの項目...
-
[python] 文字列を変数名として...
-
16進の10進変換について
-
selectタグ内の特定のoptionの...
-
FindFirst を複数条件で検索
-
構造体の各データの表示につい...
-
実行時エラー 3020の対策
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6で、長い時間かかる処理...
-
初回起動のみ判別したい
-
C言語のflagの使い方が分かりま...
-
処理終了後、他のページへジャ...
-
実行中の変数の中身をイミディ...
-
フラグをたてる、、の意味を教...
-
VBAのCallステートメントについて
-
UWSC SLCTBOXもしくはSELECTに...
-
arduino の割り込み処理について
-
問題作成のWebアプリの作り方を...
-
Pythonでこのプログラミングを...
-
SetDlgItemInt( ) c++
-
C#でDataFridViewの行をすべて...
-
ラジオボタン選択内容を取得し...
-
スカラー変数に処理を入れる
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
16進の10進変換について
-
<SELECT>タグの折り返し
-
formで特定のinputを送信しない...
おすすめ情報