【COBOL学習|豆知識】COBOLの「文字数違い」比較を制する!暗黙の空白充填を味方につけるテクニック

導入: なぜこの「暗黙のルール」を知る必要があるのか

COBOLで文字列比較を行う際、うっかりしていると「意図しない結果」に悩まされることがあります。特に長さの異なる項目同士を比較する場合、COBOLは自動的に短い方の右側にスペースを補完して比較を行います。この仕様を正しく理解していないと、論理エラーの温床となります。今回は、この挙動を逆手に取り、堅牢な条件分岐を作成するためのノウハウを解説します。

基礎知識: COBOLの比較規則「右詰め空白充填」

COBOLにおいて、異なる長さの英数字項目(DISPLAY型など)を比較する際、システムは内部的に「短い項目を長い項目と同じ長さに合わせる」という処理を行います。このとき、不足している右側の桁には自動的に「スペース」が埋められます。
例えば、10桁の項目と3桁の文字列「ABC」を比較する場合、比較の瞬間には「ABC」が「ABC 」へと内部的に変換されます。この挙動を知っていれば、部分一致やデータの切り出し処理を非常にシンプルに記述できます。

実装/解決策: 構造化制御構文での活用

この特性を活用することで、特定の接頭辞を持つかどうかの判定を、複雑な関数やサブルーチンを使わずに、単純なIF文だけで記述可能です。ただし、注意すべきは「末尾の空白」が比較に影響を与える点です。意図しない空白混入を防ぐため、比較対象は必ず定数または定義済みの変数で行うのが鉄則です。

サンプルプログラム: 文字列比較の具体例

以下のコードは、入力データから特定の接頭辞を判定する実用的なパターンです。

01 WS-INPUT-DATA PIC X(10) VALUE “ABC1234567”.
01 WS-CHECK-PATTERN PIC X(3) VALUE “ABC”.

PROCEDURE DIVISION.
> 比較対象のWS-INPUT-DATAは10桁、WS-CHECK-PATTERNは3桁。
> IF文の比較時、WS-CHECK-PATTERNは自動的に「ABC 」に拡張される。
IF WS-INPUT-DATA(1:3) = WS-CHECK-PATTERN
DISPLAY “成功: 指定した接頭辞で始まっています。”
ELSE
DISPLAY “失敗: 接頭辞が一致しません。”
END-IF.

> 応用: 部分一致の確認
IF WS-INPUT-DATA(4:3) = “123”
DISPLAY “成功: 4桁目から3文字は123です。”
END-IF.

GOBACK.

応用・注意点: 現場で役立つバグ回避術

実務で最も陥りやすいのは、「空白を含んだ文字列」との比較です。
1. 空白の混入: 比較対象の変数が「ABC 」(末尾に空白あり)のように定義されている場合、自動充填されたスペースと衝突し、意図せず一致してしまうことがあります。比較元・比較先は、定義時にVALUE句で明示するか、あらかじめINSPECT文で空白を排除してから比較する習慣をつけましょう。
2. 全角文字の混入: 今回のルールはあくまで「英数字(PIC X)」を前提としています。日本語(PIC Nなど)が混在する環境では、文字コードや1文字のバイト数が異なるため、この自動充填の恩恵は受けられません。日本語比較の場合は、必ず専用の比較関数や文字数制御を検討してください。

この「暗黙の整形」を意識的にコントロールできるようになれば、コードの記述量は減り、メンテナンス性も向上します。ぜひ現場のロジックに組み込んでみてください。

コメント

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