【PL/I学習|豆知識】メインフレーム開発の必須知識!LENGTH関数で文字列操作を確実にする方法

導入

メインフレームの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の値を確認する習慣をつけましょう。

コメント

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