【実務・中級編】VERIFY組み込み関数による入力値検証のロジック – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「予約語なし」という自由と、VERIFY関数が教える入力値検証の深淵

ようこそ、メインフレームの深淵へ。数十年物のレガシーシステムを保守していると、「なぜこの言語はこんなに自由なのか」と頭を抱える夜があるだろう。PL/I(Programming Language One)の最大の武器であり、同時に初心者を迷わせる最大の罠、それは「予約語(Keyword)という概念が存在しない」ということだ。

C言語やJavaに慣れた若手エンジニアから見れば、`IF`や`THEN`といった構文要素が変数名として使えるなど、狂気の沙汰に見えるかもしれない。しかし、この「文脈によって解釈を変える」柔軟性こそが、我々が扱う基幹システムの複雑なロジックを支えてきたのだ。

今日はその中でも、バッチ処理の入力チェックで避けては通れない`VERIFY`関数について、現場の知見を交えて深掘りしていく。

1. 予約語なき世界での「VERIFY」の挙動

まず前提として、PL/Iにおいて`VERIFY`は予約語ではない。あくまで「標準提供されている組み込み関数」だ。だが、もし君が変数名に`VERIFY`と付ければ、そのスコープ内では組み込み関数のVERIFYは隠蔽される。コンパイラはコンテキストから「これは関数か? 変数か?」を必死に解析するわけだが、この挙動を理解していないと、改修時に思わぬバグを生むことになる。

VERIFY関数の本質

`VERIFY(X, Y)`は、文字列`X`の中に、文字列`Y`に含まれない文字が最初に現れる位置を返す。

  • 戻り値: 指定セットに含まれない文字のインデックス(1から始まる)。
  • 正常系: 全てがセットに含まれていれば「0」を返す。

この「0」を返すという仕様が、現場のバッチ処理における「入力値検証」の要となる。

2. 実践:VSAM入出力と入力検証のコード例

現場でよくある、帳票出力や更新バッチの入力チェックを想定してみよう。VSAMファイルから読み込んだフィールドが「数字(0-9)のみで構成されているか」を確認する処理だ。

1
/ ———————————————————– /
/ 入力値検証サンプル:入力エリアが数字のみか確認する /
/ ———————————————————– /
DCL INPUT_FIELD CHAR(10) INIT(‘12345A7890’); / 検証対象データ /
DCL VALID_SET CHAR(10) INIT(‘0123456789’); / 許可文字セット /
DCL ERROR_POS FIXED BIN(15); / 異常位置保持用 /

/ VERIFY関数でセットに含まれない文字を検索 /
ERROR_POS = VERIFY(INPUT_FIELD, VALID_SET);

IF ERROR_POS > 0 THEN DO;
/ 0以外が返れば、それは不正な文字が存在することを意味する /
PUT SKIP LIST(‘入力値異常:’ || INPUT_FIELD);
PUT SKIP LIST(‘異常文字位置:’ || ERROR_POS);

/ ここでONユニット(ERROR/CONVERSION)の制御フローを考慮しつつ、/
/ 必要であれば異常終了やリカバリ処理へ飛ばすロジックを組む /
SIGNAL CONDITION(INPUT_ERROR);
END;
ELSE DO;
PUT SKIP LIST(‘入力値は正常です。’);
END;

3. 現場エンジニアが教える「デバッグのコツ」

この`VERIFY`を使う上で、いくつか注意すべき「現場の鉄則」がある。

  • スペースの罠:

`VERIFY(INPUT_FIELD, ‘0123456789’)`とした場合、`INPUT_FIELD`にスペース(空白)が含まれていると、それは許可外の文字として検知される。空白を許容したい場合は、`VALID_SET`に明示的にスペースを含めるのを忘れるな。

  • 長さの不一致(TRIMの活用):

VARYING属性の文字列でない限り、`CHAR(10)`などは常に10桁として扱われる。末尾の空白を無視したい場合は、`TRIM(INPUT_FIELD)`を噛ませてからVERIFYに投げるのが鉄則だ。これを怠ると、意図しない桁の空白でエラーを吐き続けることになる。

  • ONユニットとの連携:

もしデータが数値型として定義されており、`GET`命令などで入力変換(CONVERSION)エラーが発生した場合、`ON CONVERSION`ユニットが発火する。`VERIFY`は、その変換エラーが起きる前に、プログラム側でガードをかけるための「安全装置」だと考えるべきだ。

最後に:なぜPL/Iなのか

今の時代、基幹システムをモダンな言語で書き換える話は絶えない。しかし、PL/Iが持つこの「ハードウェアに肉薄する制御能力」と「柔軟すぎる言語仕様」は、一度使いこなせば他のどの高級言語よりも強力な武器になる。

`VERIFY`の戻り値ひとつとっても、単なる関数の戻り値として見るのではなく、「このデータは信用できるか?」というシステム防衛の第一線だと捉えてほしい。

君が今向き合っているそのソースコードも、先人が同じように悩み、工夫して積み上げてきた歴史の一部だ。バグが出たときこそ、マニュアルの行間を読み、コンパイラの気持ちになってコードを追ってみろ。そうすれば、必ず道は開けるはずだ。

また何か壁にぶつかったら、いつでもここに来てくれ。君の健闘を祈る。

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