1. 導入:なぜこの仕様を理解すべきなのか
COBOLの文字列操作において、INSPECT REPLACINGは非常に強力なツールです。しかし、ベテランの私でも時折見かけるのが「置換後の文字列が、さらに置換されることを期待してコードを書く」というミスです。この仕様を誤解すると、テストデータでは通ったのに本番でバグが出る、という致命的な事態を招きます。本稿では、INSPECT文の「一過性」という性質を正しく理解し、現場での事故を防ぐための作法を解説します。
2. 基礎知識:1パススキャンの原則
INSPECT REPLACINGの動作は「1パススキャン」と定義されています。これは、対象となるデータ領域を左から右へ「一度だけ」走査することを意味します。
重要なのは、一度置換された文字は、その実行文の中では二度と再評価されないという点です。つまり、置換によって生成された新しい文字列に対して、さらに置換を重ねることはできません。この挙動は、処理の予測可能性を高めるためのCOBOLの設計思想ですが、再帰的な置換が必要な場合には注意が必要です。
3. 実装/解決策:ループ構造による多段階置換
もし、ある文字を別の文字に変えた後、その結果に対してさらに別の置換を行いたい場合は、INSPECT文を連続して記述するか、PERFORMによるループ処理を検討する必要があります。
現場でよくあるケースとしては、特定の記号を変換した後に、その結果に含まれるスペースをトリミングするといった処理です。これらは一つのINSPECTで完結させようとせず、論理的なステップに分けて記述するのが堅牢なコードの秘訣です。
4. サンプルプログラム:置換の一過性を確認する
以下のコードは、一過性の性質を証明するものです。「A」を「B」に、「B」を「C」に置換しようとした場合、結果はどうなるかを確認してください。
IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TEST-DATA PIC X(5) VALUE "AABAA".
PROCEDURE DIVISION.
> 意図: AをBに変え、そのBをCに変えたい
> しかし、一度のINSPECTでは結果は「BB B BB」となる
INSPECT TEST-DATA REPLACING ALL "A" BY "B"
ALL "B" BY "C".
DISPLAY "変換結果: " TEST-DATA.
> 表示結果は「BB B BB」となる(Cにはならない)
> 正しく再帰的(多段階)に置換したい場合は以下のように分ける
MOVE "AABAA" TO TEST-DATA.
INSPECT TEST-DATA REPLACING ALL "A" BY "B".
INSPECT TEST-DATA REPLACING ALL "B" BY "C".
DISPLAY "段階的置換の結果: " TEST-DATA.
GOBACK.
5. 応用・注意点:現場で役立つ補足
実務において最も陥りやすいのは、「INSPECT文を複雑にしすぎて、可読性が著しく低下する」ことです。
・デバッグの難易度:複数のREPLACING句を並べすぎると、どの順序で評価されているのか(またはされていないのか)が不明瞭になります。
・パフォーマンスの考慮:1パススキャンである以上、INSPECTを何度も実行するのは計算コストがかかります。もし文字列が極めて長い場合や、オンライン処理のようにレスポンスが重視される場合は、パフォーマンスへの影響を考慮し、必要最小限の回数で処理を終える設計を心がけてください。
結論として、INSPECTは「単純かつ高速な置換」に適しています。もし複雑なパターンマッチングや再帰的な変換が必要な場合は、無理に一つのINSPECTに詰め込まず、PERFORMによるループ処理へ切り替える判断が、ベテランの「作法」といえます。

コメント