導入
メインフレームのPL/I開発において、文字列の長さを正確に把握することは非常に重要です。特に、動的なデータや可変長文字列(VARYING属性)を扱う際、誤った長さでメモリを参照したり、不要な空白を含めた処理を行ったりすると、システム障害の原因となります。本日は、LENGTH組み込み関数の正しい使い方と、固定長文字列との付き合い方について解説します。
基礎知識
LENGTH関数は、引数に指定した文字列やビット列の「長さ」を返却する関数です。ここで重要なのが、対象変数の属性による挙動の違いです。
VARYING属性の変数の場合、そのデータが現在保持している「有効な長さ」を返します。一方、固定長(CHAR(n)等)の変数の場合、データの中身に関わらず、宣言時に定義した「固定サイズ」を常に返します。この仕様の違いを理解していないと、「データは入っているのに、末尾の空白までカウントされてしまう」という問題が発生します。
実装/解決策
固定長文字列において、末尾の空白を除いた「実効的な長さ」を取得したい場合は、LENGTH単体ではなく、TRIM関数と組み合わせるのが定石です。これにより、データの後方に含まれる不要なスペースを排除した正しい文字数を取得できます。
サンプルプログラム
以下のコードは、VARYING変数と固定長変数それぞれのLENGTH関数の挙動を示したサンプルです。
/ サンプル:LENGTH関数の挙動確認 /
TEST_PROC: PROCEDURE OPTIONS(MAIN);
DCL V_STR CHAR(20) VARYING INITIAL(‘IBM’);
DCL F_STR CHAR(20) INITIAL(‘IBM’);
DCL L1 FIXED BIN(15);
DCL L2 FIXED BIN(15);
DCL L3 FIXED BIN(15);
/ VARYING変数の場合:現在の長さ(3)が返る /
L1 = LENGTH(V_STR);
PUT SKIP LIST(‘VARYING変数の長さ:’, L1);
/ 固定長変数の場合:宣言したサイズ(20)が返る /
L2 = LENGTH(F_STR);
PUT SKIP LIST(‘固定長変数の宣言サイズ:’, L2);
/ 末尾空白を除いた長さを知る手法:TRIMを使用 /
L3 = LENGTH(TRIM(F_STR));
PUT SKIP LIST(‘TRIM併用時の実効長さ:’, L3);
END TEST_PROC;
応用・注意点
現場でよくあるミスとして、固定長CHAR変数に対してLENGTHの結果をそのままループの終了条件にしてしまい、無駄なループ回数を増やしてしまうケースがあります。特にデータベースから取得したデータは固定長であることが多いため、TRIM関数を忘れない癖をつけることがバグを未然に防ぐ鍵となります。
また、ビット列に対して使用する場合も同様にビット長が返されます。処理対象が文字なのかビットなのかを意識し、意図したメモリ長を扱えているか、常にデバッグ時にLENGTHの値を確認する習慣をつけましょう。

コメント