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

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

「PL/I? なんだか古めかしくて難しそうな名前だな……」と身構えてしまうかもしれませんね。でも大丈夫です。JavaやCOBOLという素晴らしい武器を持つ皆さんなら、この「レガシーの巨人」も必ず手懐けることができます。

今回は、PL/Iの入力値検証の要である『VERIFY組み込み関数』について、その少し変わった挙動と、PL/I特有の「ゆるいけれど強力な」世界観を紐解いていきましょう。

1. PL/Iの「自由すぎる」命名規則と予約語のお話

まず、PL/Iの世界に足を踏み入れて驚くのが、「予約語」の考え方です。Javaなら `if` や `while` は変数名に使えませんよね。でも、PL/Iは違います。

PL/Iには「厳密な予約語」という概念がありません。極端な話、`IF` という名前の変数を宣言して、`IF = 10;` と書くことすらできてしまいます。

「えっ、それってバグの温床じゃない?」と思いますよね? その通りです。だからこそ、PL/Iのコードを読むときは、コンパイラが「文脈(コンテキスト)」をどう解釈しているかを読み解く力がプロの証になります。この「ルールに縛られない自由さ」は、メインフレームが誕生した当時のエンジニアたちの「機械を極限まで使い倒したい」という情熱の名残なんです。

2. そもそも「VERIFY関数」って何をしてるの?

さて、本題の `VERIFY` 関数です。この関数は、「指定した文字列の中に、許可されていない文字が混ざっていないか?」を調べるためのものです。

イメージで理解する VERIFY

例えば、顧客コードを入力する欄に「数字以外は絶対に入れたくない!」とします。その時に `VERIFY` を使います。

  • 引数1: 調べたい対象(ソース文字列)
  • 引数2: 許可されている文字セット(参照文字列)

もし、ソース文字列の中に「許可リスト(引数2)」にない文字が見つかったら、その「最初に見つかった位置」を返します。全部OKなら「0」が返ってきます。

3. 実践コードで動きを追ってみよう

百聞は一見に如かず。実際にバッチプログラムで使われるようなコード例を見てみましょう。

1
/ 入力値検証のサンプルプログラム /
CHECK_INPUT: PROCEDURE OPTIONS(MAIN);

DCL INPUT_STR CHAR(10) INIT(‘123A5’); / 検証したい値 /
DCL VALID_SET CHAR(10) INIT(‘0123456789’); / 許可する文字セット /
DCL POS FIXED BIN(15); / 見つかった位置を格納する変数 /

/ VERIFY関数の実行 /
/ INPUT_STRの中に、VALID_SETに含まれない文字を探す /
POS = VERIFY(INPUT_STR, VALID_SET);

IF POS > 0 THEN
PUT SKIP LIST(‘エラー発見! ‘ || POS || ‘文字目に不正な値があります。’);
ELSE
PUT SKIP LIST(‘入力値は正常です。’);

END CHECK_INPUT;

このコードのポイント

1. DCL(宣言): PL/Iでは `DCL` (DECLARE) を使います。`FIXED BIN` は「整数型」だと思ってください。
2. 戻り値の意味:

  • 今回の例だと、`INPUT_STR` の4文字目に「A」が入っていますよね。
  • `VERIFY` 関数は「A」が `VALID_SET` にないことを検知し、`4` を返します。
  • もし不正な文字がなければ `0` が返る。これがPL/I流の「シグナル」です。

4. なぜ「VERIFY」という名なのか?

「検証」を意味する `VERIFY` という名前ですが、実のところ「不正な文字を特定する」というネガティブな動作をします。

これはメインフレーム時代、パンチカードでデータを入れていた頃の名残かもしれません。「正しいか確認する」というよりは、「異常なデータが紛れ込んでいないか、監視の目を光らせる」という感覚が、この関数の本質です。

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

PL/Iのコードは、一見するとCOBOLのように冗長に見えたり、C言語のように記号が多く見えたりするかもしれません。でも、その一つ一つには「計算リソースを最小限に抑え、確実に処理を完遂する」ための工夫が詰まっています。

`VERIFY` 関数を使えば、面倒なループ処理(IF文で一文字ずつ判定するようなロジック)を自分で書く必要はありません。コンパイラが最適化されたマシンコードを吐き出し、驚くべき速度で処理してくれます。

皆さんが今担当しているシステムの裏側で、この `VERIFY` たちが今日も何億件ものトランザクションを黙々と守っています。そう考えると、少しだけこの古い言語が愛おしくなってきませんか?

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

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