🧩 今日の学び
• READ文は「ファイルから1行読む」命令。
• AT END/NOT AT ENDで「終わった」「まだある」を判断できる。
• EOF-YESをTRUEにすることで、PERFORMループを自然に終了できる。
今日のコード
READ-INFILE.
READ INFILE
AT END
SET EOF-YES TO TRUE
NOT AT END
ADD 1 TO TOT-RECORDS
PERFORM PARSE-AND-VALIDATE
END-READ.
なるお)まずなんだってー?
READ-INFILE.
INFILEを読むんでしょ?
READ INFILE
2回同じこと言われるとか、バカにしてる?
これだから老害は…
段落と命令のちがいを噛みしめる
よく見ろよ、READ-INFILE. は 段落名(ラベル) だ。
ドットついてんだろ?
「ここから READ-INFILE っていう処理が始まりますよ」って看板立てただけのやつ。
係長)誰が老害だよ。
一方で「READ INFILE」は 命令文。
「INFILE っていうファイルから1レコード読み込め」って指示してんだ。
な)え、じゃあ全然別物!?物忘れじゃない?
俺「二回言ってるじゃん!ダブってるじゃん!」って思ってましたけど!
係長は昨日の夜、何食べたか忘れてるんだろうなって思ってました。
係)なんでだよ! (←実は忘れてる)
ま、まぁ、段落名と文法をゴッチャにすんなよ。
「ここは『ファイル読み取り処理』って段落です」ってラベルをつけて、その中で READ してるってわけだ。
な)…じゃあ、「おっすおら悟空!」って名札つけて、くらえ「太陽拳!」って太陽拳をくらわせる感じですか?目が眩む感じですか?
係)…「名札(段落名)」は呼び出し側(PERFORM)で使う用。
自己紹介(命令文)はマシンに向けて「読め!」って言ってるわけ。
な)あのー係長?
ラベルなんすか?段落名なんすか?なんかどっちも出てきてごちゃになる…
係) COBOL では「ラベル」って呼ばずに 段落名(Paragraph name) って言うのが正式だ。
段落名は
・READ-INFILE. とか INIT. とか MAIN. の部分
・PROCEDURE DIVISION の中に書ける
・文のまとまりの「タイトル」みたいなもの
・PERFORM 段落名 で呼び出して使う
という感じだ。
な)おー教則本ぽい!七三分けの銀行員っぽいすね!
AT END/NOT AT END:終わりと続きの分かれ道
で、INFILEをよみこむとして…
AT END
SET EOF-YES TO TRUE
NOT AT END
ADD 1 TO TOT-RECORDS
PERFORM PARSE-AND-VALIDATE
AT ENDとNOT AT ENDだから、終わったらこうで、終わらなかったらこうでということ?
30年後、あたしたちが生きていたら、、、この時間にこの場所で、また会いましょう。
あたしたちのどちらかでも、この世にいなかったら、、、今日でさようなら…ね。
みたいな?
係)なんかイラッとしたが、まぁ間違ってるわけではないな。
な)30年後先の話も書けますよ!書きますか?
係)いるわけねーだろ。
な)むー、別れた二人がどうなったか気にならないとは。
愛を忘れちゃったんすか…
AT END
ファイルの終わり(End Of File=EOF)に達したときの処理を書く。
ここでは SET EOF-YES TO TRUE。
つまり「もうファイルの終わりだよ」って旗を立てる。
NOT AT END
まだ読み込むレコードがあったときにやる処理。
今回は「レコード数カウントして」「そのデータを検証に回す」。
READ-INFILE.
READ INFILE
AT END
SET EOF-YES TO TRUE
NOT AT END
ADD 1 TO TOT-RECORDS
PERFORM PARSE-AND-VALIDATE
END-READ.
ふふ、係長全部わかっちゃいましたよ。
EOF-YESが真になる瞬間
な)なにかが終わったら、EOF-YESをTRUEになる、つまり終わりだよーって伝えて、ループを止めてくれる。
今ここで、ループしてて、
PROCESS-LOOP.
PERFORM READ-INFILE
UNTIL EOF-YES.
READ-INFILEを実行、EOF-YESがTURE(真)になるまでってことだった。
AT ENDになるとEOF-YESがTRUEになって、ループが止まると。
なにかが終わってなければ、
ADD 1 TO TOT-RECORDS
PARSE-AND-VALIDATE
TOT-RECORDSが一つ増加で、PARSE-AND-VALIDATEが発動する。
PARSE-AND-VALIDATEでデュエル開始だ!
ね、完璧でしょ?でしょ?
係)何かってなんだよ。
な)えっと…なにか、ですよ?
その何かにはこの世のすべてが詰め込まれているんですよ。
そう、パンドラの箱ですよ!
なにかが終わるんですから、パンドラの箱を開いたら終わるんですよ!
係)お前この前、近くにないからわからんとか言ってたくせにな。
READ INFILEがすぐ上にあるだろが。
READ INFILE
AT END
SET EOF-YES TO TRUE
NOT AT END
ADD 1 TO TOT-RECORDS
PERFORM PARSE-AND-VALIDATE
おむすび
結局、どこにあってもわかねーんじゃねーか
な)あ・・・。
い、いや、俺、近眼なんで、視力が0.01ぐらいなんで、近くても遠くても別に関係ないんで!
見えないんで!
係)メガネかけてるだろが。

コメント