1. 導入:なぜREVERSEを使うのか
COBOLの実務において、ファイル名や文字列の「末尾」が特定のパターン(拡張子や特定のコード)に一致するかを判定する場面は多々あります。伝統的な手法では、文字列の長さを取得し、そこからオフセットを計算して部分参照(参照修飾)を行う必要がありました。しかし、この計算は非常に煩雑で、特に可変長項目を扱う際に「境界値エラー」や「計算ミス」によるバグを誘発しやすいという課題があります。
そこで今回紹介するのは、組込関数 REVERSE を活用した「後方一致判定」です。文字列を反転させてから前方一致を確認することで、複雑なオフセット計算を排除し、コードの可読性と保守性を劇的に向上させます。
2. 基礎知識:REVERSE関数とは
REVERSE関数は、引数として渡された文字列を逆順にして返す組込関数です。
例えば「ABCDE」という文字列に適用すれば「EDCBA」となります。この性質を利用し、「末尾3文字が『JPG』であるか判定したい」という要件に対し、「先頭3文字が『GPJ』であるか判定する」という論理に置き換えることができます。これにより、文字列の長さを意識することなく、シンプルに先頭からの参照が可能になります。
3. 実装・解決策
実装のポイントは、比較対象の文字列(定数)もあらかじめ逆順にしておくことです。
例えば、拡張子「.CSV」を判定したい場合、通常なら末尾4文字を抜き出しますが、REVERSEを使えば「文字列を逆順にし、先頭4文字が『VSC.』であるか」を判定するだけで済みます。これにより、ファイル名の長さが変動しても、常に「1:4」という固定の参照位置で判定が可能になります。
4. サンプルプログラム
以下に、ファイル名の拡張子をチェックする実用的なコード例を示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. CHECK-EXT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-FILENAME PIC X(20) VALUE "REPORT_2023.CSV".
01 WS-REVERSED PIC X(20).
PROCEDURE DIVISION.
> 文字列を反転させて判定エリアに格納
MOVE FUNCTION REVERSE(WS-FILENAME) TO WS-REVERSED.
> 後方一致(.CSVかどうか)の判定
> 元の末尾4文字が「.CSV」であるかを、先頭4文字「VSC.」で比較
IF WS-REVERSED(1:4) = "VSC."
DISPLAY "CSVファイルが検出されました。"
ELSE
DISPLAY "対象外のファイルです。"
END-IF.
GOBACK.
5. 応用・注意点:現場での活用と落とし穴
このテクニックには、現場で知っておくべき注意点が2つあります。
・比較対象の定数定義に注意
比較対象の定数(上記の例では”VSC.”)を間違えると当然判定ミスになります。また、比較対象が英大文字・小文字を区別する環境である場合、事前に UPPER-CASE 関数を併用して正規化しておくことが推奨されます。
・空白(スペース)の扱い
REVERSE関数は、定義された項目長全体を反転させます。もしデータ項目に後続の空白(スペース)が含まれている場合、それらも反転して先頭に来てしまいます。必要に応じて、判定前に TRIM 関数や FUNCTION FUNCTION-TRIM を使用して空白を除去するか、あるいは比較対象の文字列に空白を考慮した値を設定するようにしてください。
この「逆転の発想」を用いることで、複雑な条件分岐がスッキリ整理されます。ぜひ次回の開発で活用してみてください。

コメント