PL/Iの「魔法のマスク」を解読する:PIC ‘9’と’Z’の意外な関係
皆さん、こんにちは。長年メインフレームの深淵でコードを書き続けてきたアーキテクトです。
JavaやC#といった現代的な言語から、突如としてこの「PL/I」という古の言語に放り込まれた皆さん。画面に並ぶ `DCL` や `PIC` といった見慣れない記号に、少し戸惑っていませんか?
大丈夫です。PL/Iは、一見すると「呪文」のようですが、実は非常に論理的で、一度コツを掴めばこれほど頼りになる相棒はいません。今日は、帳票出力やデータ変換で必ずと言っていいほど遭遇する「数値編集(Picture句)」の基礎、特に ‘9’ と ‘Z’ の違いについて、現場の視点から紐解いていきましょう。
—
そもそも「Picture(画像)」って何?
PL/Iにおいて `PICTURE`(または `PIC`)は、変数の「見た目」を決定づけるマスクのようなものです。
例えば、Javaの `int` 型は単なる数値ですが、PL/Iの `PIC` は、「データがどうメモリに格納され、どう表示されるべきか」というルールを、変数そのものに刻み込みます。
この「見た目の定義」が、帳票出力の現場で大きな役割を果たします。
—
先行ゼロの「守護神」:’9′ と ‘Z’
帳票で「000123」と出るか、「 123」と出るか。この違いを決定づけるのが、`9` と `Z` です。
1. 頑固な ‘9’(Numeric Digit)
`PIC ‘9’` は「ここは必ず数字が入るぞ!」という強い意志を表します。
仮に変数に `123` という値が入っていて、定義が `PIC ‘999999’` だとしましょう。すると、空いた桁は律儀に `0` で埋められます。結果は “000123” です。
2. 空気を読む ‘Z’(Zero Suppression)
一方、`PIC ‘Z’` は「0(ゼロ)を表示したくない」という控えめな性格です。
同じ値 `123` を `PIC ‘ZZZZZ9’` で受け取ると、上位のゼロはすべてスペース(空白)に変換され、結果は ” 123″ となります。
なぜ `Z` を使うのか? それは、帳票を見た人間が「金額の桁数」を直感的に把握しやすくするためです。0が羅列されている帳票よりも、適度に空白が入っている方が、読みやすさは段違いですよね。
—
実際にコードで見てみましょう
現場のバッチプログラムを想定した、シンプルな例です。
/i
/ プログラムの基本構造:PROCEDUREとOPTIONS(MAIN) /
SAMPLE_PIC: PROC OPTIONS(MAIN);
/ DCL(宣言): 変数の定義です /
DCL VALUE_NUM FIXED DEC(6) INIT(123);
/ 9で定義:先行ゼロが表示される /
DCL OUT_9 PIC ‘999999’;
/ Zで定義:先行ゼロがスペースになる /
DCL OUT_Z PIC ‘ZZZZZ9’;
OUT_9 = VALUE_NUM;
OUT_Z = VALUE_NUM;
/ PUT SKIPで標準出力へ書き出し /
PUT SKIP EDIT(‘PIC 9の結果:’, OUT_9) (A, A);
PUT SKIP EDIT(‘PIC Zの結果:’, OUT_Z) (A, A);
END SAMPLE_PIC;
このコードを実行すると、コンソールやスプールには以下のように出力されます。
PIC 9の結果:000123
PIC Zの結果: 123
—
ここで注意!変換時の「例外」と罠
さて、ここからが少しだけ「現場の知恵」です。
`PIC` を使ったデータ移動は、単なる代入ではなく「変換」です。
- 桁あふれ(Overflow)の恐怖:
もし `VALUE_NUM` が `1234567` となり、`PIC ‘999999’` の変数に代入しようとすると、上位桁が切り捨てられ、システムによっては計算例外(FIXEDOVERFLOW)が発生したり、データが破壊されたりします。
- 非数字の混入:
`PIC ‘9’` や `PIC ‘Z’` が定義された変数に、数値以外の文字(スペースなど)が入った状態で計算を行おうとすると、プログラムは即座に「コンバージョン・エラー」で異常終了します。これはメインフレームのバッチでは日常茶飯事のトラブルです。
アーキテクトからのアドバイス
「なんとなく動くから」と `PIC` を定義するのではなく、「この変数は計算に使うのか? それとも帳票に出すだけか?」を常に意識してください。
計算に使う変数は `FIXED DEC` や `BIN FIXED` を使い、帳票出力の直前に `PIC` 変数へ `MOVE`(代入)する。これが、トラブルを未然に防ぐ「メインフレーム流・堅牢な設計」の第一歩です。
—
終わりに:怖がらなくて大丈夫
PL/Iの `PIC` は、最初は不親切なルールのように思えるかもしれません。しかし、これは「データがどうあるべきか」を厳格に管理するための知恵です。
先行ゼロを消すだけで、帳票の品格はぐっと上がります。次にコードを書くときは、ぜひ `Z` を使って、読み手にとって親切な数値表示を試してみてくださいね。
また次回の記事では、`PACKAGE` を使ったモジュール分割のコツについてお話ししましょう。現場で培った「動くコード」の感覚を、皆さんと共有できるのを楽しみにしています。
それでは、良いコーディングライフを!
