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

メインフレームの世界へようこそ!PL/Iの「ON ENDFILE」でファイル処理を優雅に制御しよう

こんにちは。IBMメインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきたエンジニアの方にとって、PL/I(ピーエルワン)という言語は、一見すると「なんだか古臭くて難しそう……」に見えるかもしれません。

でも、安心してください。PL/Iは「科学技術計算の強さ」と「事務処理の堅牢さ」を併せ持った、非常に洗練された言語です。今日はその中でも、バッチ処理の心臓部といえる「ファイル終了(EOF)の検知」について、PL/I流のスマートなやり方を一緒に紐解いていきましょう。

そもそも、PL/Iのプログラムってどんな形?

まずは基本の形を見てみましょう。Javaでいう`public static void main`にあたるのが、PL/Iの`OPTIONS(MAIN)`です。

/i
MYPROG: PROCEDURE OPTIONS(MAIN);

/ ここに変数宣言や処理を書きます /
PUT SKIP LIST(‘システム稼働開始!’);

END MYPROG;

PL/Iでは、プログラムの開始と終了を`PROCEDURE`と`END`で囲みます。`MYPROG:`のようなラベルを付けることで、どこからが処理の単位なのかを明示するんですね。このシンプルさが、実は数十年もの間、基幹システムを支え続けてきた秘訣でもあります。

「ファイルが終わった!」を検知する:ON ENDFILEの魔法

さて、本題です。外部ファイル(データセット)からデータを読み込む際、一番怖いのは「どこまでがデータか分からない」ことですよね。

COBOLなら`READ FILE AT END …`と書くところですが、PL/Iでは「ON条件(ON-Unit)」という、より宣言的でエレガントな仕組みを使います。

「ファイルが終了したら、こう振る舞え!」という命令をあらかじめ登録しておくイメージです。これが非常に強力なんです。

実践コード:ファイルを読み切るまでループする

/i
GET_DATA: PROCEDURE OPTIONS(MAIN);

/ ファイルの終了判定をあらかじめセットする /
ON ENDFILE(SYSIN) BEGIN;
PUT SKIP LIST(‘— 全データの読み込みが完了しました —‘);
STOP; / 処理をここで終了させる /
END;

/ 読み込みループ /
DO WHILE(‘1’B); / ‘1’B は論理値の TRUE /
GET FILE(SYSIN) EDIT(IN_REC) (A(80));
PUT SKIP LIST(‘読み込んだデータ: ‘ || IN_REC);
END;

END GET_DATA;

このコードのポイント

1. ON ENDFILE(SYSIN): これが「見張り番」です。このプログラムが走っている間、誰かが`SYSIN`というファイルを見ている間ずっと、ファイル終端が来た瞬間にこのブロックが呼び出されます。
2. STOP: `ON`ブロックの中で呼ばれる`STOP`は、プログラムを正常に終了させるための強力な脱出ボタンです。
3. DO WHILE(‘1’B): 無限ループに見えますよね? でも大丈夫。ファイルが終われば`ON`ブロック内の`STOP`が呼び出されるので、安全にプログラムが終了する仕組みです。

なぜこの書き方が「メインフレーム流」なのか?

Javaなどの言語では、ループの中で常に「読み込みが成功したか?」を`if`文でチェックするのが一般的です。でも、PL/Iの`ON`ユニットを使うと、「正常系の処理」と「異常系(終了処理)の制御」を綺麗に分離できるんです。

現場の巨大なバッチプログラムでは、複数のファイルを同時に扱うことも珍しくありません。そんな時、`ON`ユニットを定義しておけば、「ファイルが終わったらどうする?」という共通のルールをプログラムの先頭で定義しておくだけで、メインのロジックを汚さずに済むのです。

初心者の方がつまずきやすいポイント

  • ‘1’B って何?: PL/Iではビット列を扱うことが多く、`’1’B`は論理的なTRUEを指します。最初は奇妙に見えますが、慣れるとこのビット操作の細かさが、メモリを節約したいレガシー環境では愛おしくなってきますよ。
  • ON-Unitはどこに書くの?: 基本はプログラムの冒頭です。`PROCEDURE`の中に書くことで、その有効範囲を制御できます。

最後に:怖がる必要はありません

レガシーなシステムといっても、結局は「データを読み込んで、加工して、書き出す」という基本は現代のJavaやPythonと同じです。

PL/Iの`ON ENDFILE`のような仕組みは、最初は「制御の流れが飛ぶようで怖い」と感じるかもしれません。しかし、これは「例外処理の先駆け」とも言える非常にモダンな考え方です。

もし現場のコードで`ON ENDFILE`を見かけたら、「ああ、ここでファイルが終わった時の後始末をしているんだな」と、落ち着いて眺めてみてください。一つずつ紐解いていけば、PL/Iはあなたの頼もしいパートナーになってくれるはずです。

また分からないことがあれば、いつでも聞いてくださいね。一緒にメインフレームの深淵を楽しく紐解いていきましょう!

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