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

「ファイルが終わったらどうする?」PL/IのONユニットで読み込み制御をマスターしよう

こんにちは。メインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきた方にとって、PL/Iは「少し古めかしいけれど、実はものすごく器用で頼りになる職人」のような存在に見えるかもしれません。

今日は、そんなPL/Iの入門者が必ず最初に直面する壁、「ファイルの終わり(ENDFILE)をどうやって検知して、どうループを抜けるか?」というテーマでお話しします。

COBOLなら`READ … AT END`と書けば終わりですが、PL/Iの流儀は少しだけ「エレガント」かつ「独特」です。一緒に紐解いていきましょう。

1. PL/Iの「ONユニット」という魔法

PL/Iには「ONユニット」という強力な仕組みがあります。これは、「もし特定の異常や事態が発生したら、この処理を自動的に実行してね」というイベントドリブンな予約命令です。

ファイル読み込みが終わったという事態(ENDFILE条件)も、このONユニットで捕まえます。

ファイル読み込みのイメージ

PL/Iでのファイル読み込みは、まるで「本を読んでいる最中に、誰かが背後で『はい、ここまで!』と合図をくれる仕組み」を準備しておくようなイメージです。

2. 実践コード:こう書けば怖くない!

まずは、実際のコードを見てみましょう。`SYSIN`というファイルからデータを読み込み、終わったらループを抜ける、最も基本的なパターンです。

/i
TESTPROG: PROCEDURE OPTIONS(MAIN);

/ ファイルの終了フラグを準備(BIT(1)は0か1のフラグに最適です) /
DCL EOF_FLAG BIT(1) INIT(‘0’B);
DCL INPUT_REC CHAR(80);

/ 1. ONユニットの定義 /
/ SYSINというファイルでENDFILE(終了)が起きたら、フラグを’1’にする /
ON ENDFILE(SYSIN) EOF_FLAG = ‘1’B;

/ 2. ファイルオープン /
OPEN FILE(SYSIN) INPUT;

/ 3. ループ処理 /
READ FILE(SYSIN) INTO(INPUT_REC);

/ フラグが’1’になるまで繰り返し /
DO WHILE(^EOF_FLAG);
/ ここでデータを処理します /
PUT SKIP LIST(‘読んだ内容: ‘ || INPUT_REC);

/ 次のレコードを読み込む /
READ FILE(SYSIN) INTO(INPUT_REC);
END;

/ 4. ファイルクローズ /
CLOSE FILE(SYSIN);

END TESTPROG;

3. 初学者がつまずきやすい「PL/Iの癖」を解説

① `ON ENDFILE(SYSIN)` はどこに書く?

このコード例では冒頭に書いていますが、実はプログラム内のどこに書いても構いません。ただし、「そのONユニットが有効な範囲(スコープ)」を意識する必要があります。基本的には、ファイルを開く直前やプログラムの先頭で定義しておけば安心です。

② なぜ `DO WHILE(^EOF_FLAG)` なのか

PL/Iでは `^` が「NOT(否定)」を意味します。`^EOF_FLAG` と書くことで、「フラグがオフ(0)の間は繰り返せ」という指示になります。
COBOLの `PERFORM UNTIL` に慣れていると少し不思議に感じるかもしれませんが、「フラグが立つ(終了する)まで繰り返す」という論理構造は同じですので、すぐに慣れますよ。

③ なぜフラグを使うの?

実は、ONユニットの中で `GO TO` を使ってループの外へ強引に飛ぶという書き方も昔はよく行われていました。しかし、現代のメインフレーム開発では、「プログラムの可読性を高めるため、フラグによる制御(構造化プログラミング)」が推奨されています。コードの動きが追いやすくなるので、ぜひこちらを定石として覚えてください。

4. アーキテクトからのアドバイス:怖がらなくて大丈夫

「PL/Iって宣言が厳しそう…」と不安に思う必要はありません。
例えば `DCL INPUT_REC CHAR(80);` は「80バイトの固定長文字列」という意味ですが、これはJavaで言えば `String` を固定長でメモリ確保しているようなものです。

メインフレームの現場では、何十年も前に書かれた資産を読み解く場面も多いでしょう。そんなとき、この「ONユニット」という仕組みに出会ったら、「ああ、これはファイルが尽きた時に教えてくれる合図をセットしているんだな」と、心の中で優しく翻訳してあげてください。

もし、さらに複雑なファイル制御や、異常終了(ERROR条件)時のリカバリについて興味が湧いたら、いつでも聞いてくださいね。PL/Iは、深く学べば学ぶほど、その設計思想の合理性に驚かされる面白い言語ですよ。

今日のところは、この「ONユニットでフラグを立てる」というパターンを、ぜひご自身の環境やシミュレータで試してみてください。エラーが起きても大丈夫、それが成長の第一歩です!

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