【入門編】ON ENDFILE条件によるファイル読み込み終了の制御構造 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「ON ENDFILE」で迷子にならない!レガシー世界のファイル読み込みを優しく解説

メインフレームの世界へようこそ!Javaの`while`ループやCOBOLの`READ … AT END`に慣れている方にとって、PL/Iのファイル読み込み制御は最初、少しだけ「魔法」のように見えるかもしれません。

特に`ON ENDFILE`という仕組みは、他の言語にはあまりない「イベント駆動」に近い考え方を持っています。今日は、このPL/I流の「ファイルの終わり方」について、現場の知見を交えながら紐解いていきましょう。

1. まずはPL/Iのプログラム構造を覗いてみよう

PL/Iのプログラムは、非常に整理整頓された家のようなものです。`PACKAGE`で全体を囲み、`PROCEDURE`で部屋を区切り、`OPTIONS(MAIN)`で「ここからプログラムが始まりますよ!」と宣言します。

/i
MY_PROG: PACKAGE;

/ メイン処理の入口 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

/ ここに処理を書きます /

END MAIN_PROC;

END MY_PROG;

COBOLに慣れていると「パッケージ?」と思うかもしれませんが、これは大規模なシステムで名前の衝突を防ぐための「名前空間」だと考えてください。Javaの`package`に近い役割ですが、PL/Iではもっと堅牢に、メモリ上の配置まで管理されています。

2. 「ON ENDFILE」という名の守護神

さて、本題です。多くの言語では「読み込みに失敗したらループを抜ける」という判定をループの先頭で書きますよね。しかし、PL/Iは「ファイルの終わりが来たら、この処理を自動で実行せよ」とあらかじめ予約しておくスタイルを取ります。

これが`ON ENDFILE`ユニットです。

実際にコードを見てみましょう

/i
DCL SYSIN FILE RECORD INPUT; / ファイルの定義 /
DCL EOF_FLAG BIT(1) INIT(‘0’B); / 終了フラグ /

/ ファイルの終わり(ENDFILE)が来たら、フラグを立てるように予約 /
ON ENDFILE(SYSIN) EOF_FLAG = ‘1’B;

OPEN FILE(SYSIN);

/ EOF_FLAGが立つまで回る /
DO WHILE(EOF_FLAG = ‘0’B);
READ FILE(SYSIN) INTO(MY_RECORD);

/ 正常に読み込めた場合のみ処理 /
IF EOF_FLAG = ‘0’B THEN DO;
/ ここでビジネスロジックを実行 /
END;
END;

CLOSE FILE(SYSIN);

ここがポイント!

  • 予約(ONユニット): `ON ENDFILE(SYSIN)` は、「万が一SYSINでファイル終端に達したら、この後の命令を実行せよ」という「待ち伏せ」のようなものです。
  • スマートな分離: 読み込みループの中で「もしEOFなら…」と細かく判定しなくていいので、メインロジックがスッキリします。

3. テストの救世主:SIGNAL ENDFILE

「ファイルが空の時の動作をテストしたいけれど、わざわざ空のファイルを用意するのは面倒だな…」なんて思うことはありませんか?そんな時に使えるのが `SIGNAL` 文です。

これは「実際にファイル終端に達していなくても、達したことにする」という、いわば「強制シミュレーション」コマンドです。

/i
/ 異常系テストのために、意図的にENDFILEを発生させる /
IF DEBUG_MODE THEN DO;
SIGNAL ENDFILE(SYSIN);
END;

これを使うことで、エラーハンドリングのロジックが正しく動くか、本番環境のデータを使わずにユニットテストで確認できるんです。現場の改修で「本当にこの終了処理は動くのか?」と不安になったら、まずはこの`SIGNAL`を仕込んでトレースしてみるのが、ベテランの定石です。

4. 初学者がつまずきやすい「データ宣言」のワナ

PL/Iが「奇妙だ」と言われる理由の一つに、データ型の柔軟性があります。
例えば `DCL VAL FIXED BIN(31);` と書けば32ビット整数ですが、`DCL VAL FIXED DEC(5,2);` と書けば「小数点以下2桁を持つ5桁の10進数」になります。

これらはすべて、メインフレームが内部で効率よく計算できるように設計されたストレージ形式です。最初は難しく感じるかもしれませんが、「PL/Iはコンピュータが一番計算しやすい形でデータを保持しようとしているんだな」とイメージしてみてください。

まとめ:PL/Iは怖くない!

PL/Iの`ON ENDFILE`は、最初は独特の感覚が必要かもしれません。しかし、一度慣れてしまえば、これほど「エラー処理とメイン処理を分離して記述できる」美しい言語は他にありません。

  • ONユニットは、「もしもの時のための待ち伏せ」
  • SIGNALは、「テストのためのシミュレーター」

この2つを覚えるだけで、あなたはもうPL/Iのファイル制御をマスターしたも同然です。何か困ったことがあれば、いつでもまた聞きに来てくださいね。レガシーシステムの迷宮も、一つずつ紐解けば必ず出口が見えてきますよ!

タイトルとURLをコピーしました