【入門編】INDEXおよびVERIFY関数による文字列検索の最適化 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの世界へようこそ!「予約語なし」の自由と、文字列検索の深淵を紐解く

メインフレームの門を叩いた皆さん、ようこそ!JavaやCOBOLという「秩序ある世界」からやってくると、PL/Iの自由奔放さに最初は戸惑うかもしれませんね。

「えっ、変数名に `IF` を使ってもいいの?」
「予約語がないって、コンパイラはどうやって文を解析しているの?」

そうなんです。PL/Iは非常に懐が深いというか、ある意味「野性的」な言語です。今日は、そんなPL/Iの不思議なルールを覗きつつ、実務で絶対に避けては通れない「文字列検索(INDEXとVERIFY)」の最適解について、現場の視点でお話しします。

1. 「予約語」がないという驚異:PL/Iの命名規則

Javaでは `if` や `while` を変数名にしようものならコンパイルエラーになりますが、PL/Iには「厳密な意味での予約語」が存在しません。

例えば、こんな宣言が許されてしまいます。
/i
DCL IF CHAR(10); / 変数名が「IF」だなんて、ドキドキしますよね /

なぜこれが許されるのか?
PL/Iのコンパイラは、文脈(コンテキスト)で判断しています。「ここは命令文の始まりか? それとも単なる変数か?」を、その前後の記号や配置から読み取っているのです。まるで、空気を読んで会話を汲み取るベテランの職人のような言語なんですよ。

ただ、現場の鉄則として「分かりやすい名前をつけること」は変わりません。後輩がコードを読み解く際、変数名が `IF` や `DO` だと、デバッグする側が頭を抱えてしまいますよね。自由があるからこそ、コードの「品格」は書き手に委ねられている。それがPL/Iの面白いところです。

2. 文字列検索の二大巨頭:INDEXとVERIFY

基幹システムでのデータ加工、特にCSV形式のファイルや固定長レコードを扱う際、特定の文字を探す作業は毎日のように発生します。ここで使うのが `INDEX` 関数と `VERIFY` 関数です。

INDEX:特定文字列を「探す」

`INDEX(ソース文字列, 検索文字列)` は、指定した文字列が最初に現れる位置を返します。

/i
DCL STR CHAR(20) INIT(‘IBM-MAINFRAME-COOL’);
DCL POS FIXED BIN(15);

/ 「-」が最初に現れる位置を探す /
POS = INDEX(STR, ‘-‘);
/ POSには「4」が入ります。単純明快ですね。 /

VERIFY:特定文字「以外」を探す

一方で `VERIFY` は少し性格が違います。「この文字列の中に、指定した文字以外のものが含まれていないか?」をチェックするのに使います。バリデーション(入力チェック)の王様です。

/i
DCL DATA CHAR(5) INIT(‘12345’);
DCL RESULT FIXED BIN(15);

/ 全て数字かどうかを検証 /
RESULT = VERIFY(DATA, ‘0123456789’);
/ 全て数字なら「0」が返る。もし「12A45」なら「3」が返る(Aの位置)。 /

3. 実務で泣かないための「空文字・NULL」の挙動

ここが一番の落とし穴です。初心者が現場で真っ先にハマるのが、検索対象が空っぽの時の挙動です。

  • INDEX関数の場合:
  • 検索文字列が見つからない場合、結果は「0」になります。
  • 検索文字列が「空(LENGTH=0)」の場合、結果は「1」になります(仕様です、ここ注意!)。
  • VERIFY関数の場合:
  • ソース文字列が全て指定文字で構成されている場合、結果は「0」になります。
  • ソース文字列が「空」の場合、結果は「0」になります。

現場の教訓:
「0が返ってきたから見つかった!」と勘違いしてはいけません。特に `VERIFY` で0が返ってきたとき、それは「正常(含まれていない)」なのか「データ自体が空」なのかを意識する必要があります。

/i
/ 安全なチェック方法の例 /
IF INDEX(DATA, ‘-‘) = 0 THEN
PUT SKIP LIST(‘ハイフンは含まれていません’);
ELSE
PUT SKIP LIST(‘ハイフンが見つかりました’);

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

PL/Iは古き良き言語ですが、その文法には「効率的に大量のデータを処理する」ための知恵が凝縮されています。`INDEX` や `VERIFY` を使いこなせれば、複雑なデータ変換ロジックも驚くほどスッキリ書けるはずです。

「予約語がない」という自由は、最初は戸惑うかもしれません。でも、一つずつ紐解いていけば、これほど書き手との距離が近い言語もありません。もしバグに遭遇しても、「コンパイラと対話しているんだな」と少し肩の力を抜いてみてください。

さあ、今日もメインフレームと一緒に、安定したシステムを動かしていきましょう!何か分からないことがあれば、いつでも聞いてくださいね。応援しています。

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