導入:なぜ「逆方向検索」が重要なのか
メインフレームでのバッチ処理において、ファイルパスやディレクトリ構造を扱う際、特定の区切り文字(例:’/’ や ‘\’)を探して「ファイル名だけを抽出したい」というケースは非常に多いです。従来、プログラムの先頭からループを回して検索していましたが、これではコードが複雑になり、可読性も低下します。そこで役立つのが、F2003以降でサポートされた「VERIFY関数の逆方向検索」です。この手法を使えば、文字列の末尾から一気に目的の場所を特定でき、コードを劇的にシンプルに保つことが可能になります。
基礎知識:VERIFY関数とパラメータの仕組み
VERIFY関数は、指定した文字列の中に「特定の文字セット以外の文字」が含まれている場所を探す関数です。
一般的な構文は VERIFY(対象文字列, 検索文字セット) ですが、F2003以降ではここに「開始位置」と「検索方向」を指定できるようになりました。
今回重要なのは、第4引数の「検索方向」です。ここを「-1」に設定することで、検索が文字列の最後から先頭に向かって実行されるようになります。
実装と解決策
ファイルパスの末尾から区切り文字を探すには、以下のロジックが有効です。
1. 現在の文字列の長さ(LENGTH)を起点にします。
2. 検索方向を「-1(逆方向)」に指定します。
3. VERIFYの結果として得られた位置から、SUBSTR関数を使ってファイル名を切り出します。
サンプルプログラム
以下は、フルパスからファイル名のみを抽出するPL/I形式のサンプルコードです。そのままコピー&ペーストして動作検証にご活用ください。
/ ファイルパスからファイル名を取得するサンプル /
DCL PATH CHAR(100) INIT(‘/USER/DATA/REPORT.TXT’);
DCL FILENAME CHAR(20);
DCL POS FIXED BIN(15);
/ VERIFYを使用して、’/’以外の文字が最初に出現する位置(後ろから検索)を探す /
/ 第3引数にLENGTH(PATH)を指定し、第4引数に-1を指定することで逆方向検索を実現 /
POS = VERIFY(PATH, ‘/’, LENGTH(PATH), -1);
/ POSの位置から後ろを切り出す /
IF POS > 0 THEN
FILENAME = SUBSTR(PATH, POS);
ELSE
FILENAME = PATH;
/ 結果出力 /
PUT SKIP LIST(‘ファイル名: ‘ || FILENAME);
応用・注意点:移行時の落とし穴
この機能を使う上で最も注意すべき点は、引数の順序ミスです。
多くのエンジニアが、他の言語の「lastIndexOf()」のような感覚で引数を指定してしまい、コンパイルエラーや予期せぬ挙動に悩まされます。特に「第3引数に開始位置(長さ)」、「第4引数に方向」という順序は、現代的な言語に慣れていると直感に反することがあります。
また、文字列全体が検索対象の文字(今回の例では ‘/’)だけで構成されている場合、VERIFYは「0」を返します。この戻り値が0の場合のハンドリング(エラー処理やデフォルト値の設定)を忘れないようにしてください。現場のコードでは、必ずこの「0の判定」を条件分岐に入れ、堅牢なプログラムに仕上げるようにしましょう。

コメント