導入:なぜLENGTH関数が重要なのか
COBOL開発の現場では、可変長データの処理や、データの桁数に応じた動的な制御が求められることが多々あります。かつては、データ項目の長さを取得するために「REDEFINES」を多用したり、プログラム内でハードコーディングされた定数を使用したりしていました。しかし、これでは仕様変更のたびに修正箇所が増え、バグの温床になります。そこで活用したいのが「LENGTH関数」です。これを使うことで、プログラムの保守性を飛躍的に高めることができます。
基礎知識:LENGTH関数の仕組み
LENGTH関数は、引数として指定したデータ項目の「論理的な長さ」を返してくれる組込関数です。ここで重要なのは、それが「物理的なバイト数」ではなく、「データ定義に基づく長さ」を返すという点です。例えば、PIC X(10)と定義された項目であれば、中身がスペースであっても値が入っていても、戻り値は常に10となります。集団項目(グループ項目)を指定した場合は、その配下の全項目の合計サイズが返ります。
実装と解決策
LENGTH関数の最大のメリットは、動的な処理との親和性にあります。例えば、文字列の末尾までを特定の処理でループさせたい場合や、通信電文の長さを可変にする場合に、わざわざ定数を定義し直す必要がありません。プログラムの変更に強いコードを書くための定石といえます。
サンプルプログラム
以下のコードは、LENGTH関数を使用して項目の長さを動的に取得し、表示する例です。コピー&ペーストして、お手元のコンパイラで動作を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. LENGTH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 検証用のデータ項目
01 WS-DATA-A PIC X(20) VALUE ‘HELLO’.
01 WS-GROUP.
05 WS-ITEM-1 PIC X(5).
05 WS-ITEM-2 PIC 9(10).
01 WS-LEN-A PIC 9(4).
01 WS-LEN-GROUP PIC 9(4).
PROCEDURE DIVISION.
- WS-DATA-Aの長さ(20)を取得
COMPUTE WS-LEN-A = FUNCTION LENGTH(WS-DATA-A)
DISPLAY ‘WS-DATA-Aの長さ: ‘ WS-LEN-A
- WS-GROUPの合計長(5 + 10 = 15)を取得
COMPUTE WS-LEN-GROUP = FUNCTION LENGTH(WS-GROUP)
DISPLAY ‘WS-GROUPの合計長: ‘ WS-LEN-GROUP
GOBACK.
応用・注意点
現場での実務において、注意すべき点が二つあります。
一つ目は、「日本語文字(漢字など)」の扱いです。環境によって、文字コードがEBCDICかUTF-8かなどにより、LENGTH関数の戻り値が「文字数」なのか「バイト数」なのかが異なる場合があります。必ず対象のコンパイラのマニュアルを確認してください。
二つ目は、「OCCURS句」との組み合わせです。OCCURS句が指定されたテーブル項目に対してLENGTH関数を使用すると、そのテーブル全体(すべての要素を合わせたサイズ)の長さが返ります。特定の要素1つ分の長さを取得したい場合は、添字を付けて指定することを忘れないようにしましょう。
これらの特性を理解し、ハードコーディングを減らした堅牢なプログラムを目指してください。

コメント