【入門編】ON ENDFILEユニットによるストリーム入出力の終了制御 – PL/Iの基本構文とデータ制御実践ガイド

こんにちは!メインフレームの世界へようこそ。

「PL/I? なんだか古めかしくて難しそう……」なんて身構える必要は全くありませんよ。JavaやCOBOLを触ってきたあなたなら、PL/Iの持つ「自由度の高さ」と「緻密な制御能力」は、実はとても魅力的に映るはずです。

今日は、PL/Iの登竜門とも言える「ファイル読み込みの終わり(ENDFILE)をどう扱うか」について、現場の知恵を交えて紐解いていきましょう。

1. PL/Iの基本の「キ」:プログラムは「お部屋」でできている

まず、PL/Iのプログラム構造ですが、これは「大きな家の中に、個室がある」とイメージしてください。

  • PACKAGE: 家の外壁です。複数のプログラムをまとめることもできますが、まずは「ここからが1つのプログラムだ」という区切りだと考えてください。
  • PROCEDURE: 個室です。処理の単位ですね。
  • OPTIONS(MAIN): これがついているPROCEDUREが「玄関」です。ここがプログラムの実行開始地点になります。

1
/ プログラムの始まり /
MY_PROGRAM: PACKAGE;

/ 実行開始地点(MAIN)を持つプロシージャ /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

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

END MAIN_PROC;

END MY_PROGRAM;

これだけで、「よし、動くぞ!」という準備は完了です。簡単でしょう?

2. 「ファイルが尽きたらどうする?」ON条件の不思議

さて、本題の「ファイル読み込み終了(ENDFILE)」です。
Javaなら `while ((line = reader.readLine()) != null)` のようにループで回すのが普通ですよね。でも、PL/Iには「割り込み(ONユニット)」という、ちょっと独特で賢い仕組みがあります。

「ファイルが空になったら、自動的にこの処理を呼んでね」と、あらかじめ予約を入れておくイメージです。

実装例:ファイル読み込みの定石

1
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

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

/ 【重要】ファイルの終わりに達したときの「予約」を入れる /
ON ENDFILE(SYSIN) BEGIN;
EOF_FLAG = ‘1’B; / 終了フラグを立てる /
PUT SKIP LIST(‘ファイルが終了しました。処理を終わります。’);
END;

OPEN FILE(SYSIN);

/ 読み込みループ /
DO WHILE (EOF_FLAG = ‘0’B);
READ FILE(SYSIN) INTO(RECORD_DATA);

/ ファイル終了フラグが立っていない場合のみ処理 /
IF EOF_FLAG = ‘0’B THEN
PUT SKIP LIST(‘読み込んだデータ: ‘ || RECORD_DATA);
END;

CLOSE FILE(SYSIN);

END MAIN_PROC;

3. なぜ「ONユニット」を使うのか?

初めて見る人には、「なぜ素直にループの中で判定しないの?」と不思議に思えるかもしれませんね。

実は、PL/Iのこの仕組みは「例外処理」と「本流の処理」をきれいに分離できるというメリットがあります。もしファイル読み込み処理がプログラムのあちこちに散らばっていても、一度 `ON ENDFILE` を定義しておけば、どこで読み込んでも安全に終了処理へ誘導できるんです。

現場で役立つワンポイントアドバイス

「制御フローをどうやって復帰させるか?」という点ですが、上記の例では `EOF_FLAG` を使ってループを抜けるのが最も安全で、誰が見ても分かりやすい書き方です。

もっとトリッキーな方法として `GO TO` でループの外へ飛ばすこともできますが、コードの可読性が下がるため、「フラグを立てて、ループ条件で制御する」のが現代的なPL/I開発におけるベストプラクティスです。

4. 最後に:怖がらないで、まずは動かしてみよう

PL/Iは、型宣言が少し独特で `DCL(ディクレア)` というキーワードを使いますが、基本はCOBOLのように「何を、どれくらいの大きさで使うか」を宣言するだけです。

  • `DCL VAR CHAR(10);` (10バイトの文字)
  • `DCL NUM FIXED DEC(5);` (5桁の数字)

これだけです。メインフレームという巨大なシステムは、この小さな積み重ねで動いています。エラーが出ても大丈夫。それはシステムがあなたに「ここを直してよ」と優しく教えてくれているだけですから。

また何か壁にぶつかったら、いつでもここへ来てくださいね。現場の空気を交えながら、一緒に解決していきましょう!

それでは、良いコーディング・ライフを!

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