こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLを触ってきた皆さんが、初めてPL/Iのソースコードを開いたとき、その独特の構文に少しだけ「うっ…」と身構えてしまう気持ち、よく分かります。特に「ENDFILE」の制御なんて、モダンな言語の`while (scanner.hasNext())`のようなスマートさとは少し毛色が違いますからね。
でも大丈夫です。PL/Iは、一度その「クセ」を理解してしまえば、実は非常に強力で書き手の意図を汲み取ってくれる頼もしい言語なんです。今日は、PL/Iのバッチ処理の心臓部とも言える「ファイル読み込みの終わり方」について、一緒に紐解いていきましょう。
—
1. なぜPL/Iのループ終了は「ちょっと特別」なのか
JavaやCOBOLでは、ファイルを読み込む際に「読み込み結果を返して、それが『終わり』かどうかを判定する」という手続きを踏みますよね。
しかし、PL/Iの考え方は少し違います。「ファイルに終わりが来たら、割り込み(イベント)を発生させる」というスタンスを取るんです。これを「ON条件」と呼びます。
これを例えるなら、「読書中に誰かが肩を叩いて『もう本は終わりだよ』と教えてくれるのを待つ」ような感覚です。自分から「ページはある?」と確認しに行くのではなく、終わりが来た瞬間にプログラムが「あっ、終了ですね」と反応するわけです。
—
2. 実装の基本パターン:ON ENDFILEの魔法
まずは、最も標準的なプログラムの構造を見てみましょう。
1
/ メインプログラムの定義 /
MY_BATCH_JOB: PROC OPTIONS(MAIN);
/ ファイル(データセット)の宣言 /
DCL IN_FILE FILE RECORD INPUT;
/ 「ENDFILEが来たら、END_OF_JOBというラベルへ飛べ」という予約 /
ON ENDFILE(IN_FILE) GO TO END_OF_JOB;
/ 読み込み処理のループ /
DO WHILE(‘1’B); / 無限ループの開始。’1’B は論理値の TRUE です /
READ FILE(IN_FILE) INTO(MY_RECORD);
/ ここにメインのデータ処理を書く /
PUT SKIP LIST(MY_RECORD);
END;
/ 終了処理ラベル /
END_OF_JOB:
CLOSE FILE(IN_FILE);
PUT SKIP LIST(‘処理が正常に完了しました’);
END MY_BATCH_JOB;
ここがポイント!
- ON ENDFILE(IN_FILE) GO TO …: これがPL/I流の「終了判定」です。ファイルを読みに行こうとして、「あ、もうデータがない」となった瞬間、プログラムの実行フローを強制的に指定したラベル(この場合は`END_OF_JOB`)へジャンプさせます。
- ‘1’B: PL/Iではビット列を使って真偽値を表します。`’1’B`はTRUE、`’0’B`はFALSEです。最初は不思議に見えますが、慣れるとこの「ビットで管理している感」が心地よくなってくるはずです。
—
3. 実務でハマらないための注意点
現場でベテランたちが「ここには気をつけろよ」とよく言うポイントを2つだけ共有しておきますね。
① どこでON文を宣言するか?
`ON ENDFILE`は、プログラムの最初(PROCEDURE直後)に書いておくのが鉄則です。ループの中に入れてしまうと、読み込みのたびに「終了した時のルール」を再定義することになり、メモリやパフォーマンス、そして何よりコードの可読性に悪影響を与えます。
② GO TO を使わないスマートな書き方
先ほどのコードでは`GO TO`を使いましたが、最近の現場では、フラグ変数を使って終了判定を制御することも増えています。
1
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグを用意 /
ON ENDFILE(IN_FILE) EOF_FLAG = ‘1’B; / 終わりが来たらフラグを立てるだけ /
DO WHILE(EOF_FLAG = ‘0’B);
READ FILE(IN_FILE) INTO(MY_RECORD);
IF EOF_FLAG = ‘0’B THEN DO;
/ データがある時だけ処理を実行 /
END;
END;
こちらの方が、コードの処理フローが一本道になるので、Java出身の方には馴染みやすいかもしれませんね。
—
最後に:怖がらなくて大丈夫です
PL/Iは歴史の長い言語ですが、それは同時に「何十年も世界中の基幹システムを支え続けてきた」という圧倒的な信頼の証でもあります。
`ENDFILE`の制御ひとつとっても、最初は「イベント駆動」という考え方に戸惑うかもしれませんが、一度理解してしまえば、ファイル操作においてこれほど潔い仕組みはありません。
もしエラーが出ても、それは「PL/Iがあなたのコードを厳格に見守っている」というサインです。一つずつ丁寧に向き合えば、必ずシステムは期待通りの動きで応えてくれます。
また分からないことがあれば、いつでも聞きに来てくださいね。現場の最前線から、いつでもサポートしますよ!
