【PL/I学習|豆知識】メインフレーム技術者のためのPL/I『REPEAT』関数:意外な落とし穴と活用術

1. 導入

メインフレームの帳票出力やレポート作成において、区切り線やパディング(埋め込み)文字列を生成する際、皆さんはどのように実装していますか?PL/Iには標準で組み込み関数『REPEAT』が用意されています。しかし、この関数は現代のプログラミング言語の直感とは少し異なる挙動をするため、注意が必要です。本稿では、この関数の正しい理解と、帳票作成現場で役立つ実装方法を解説します。

2. 基礎知識

PL/Iにおける『REPEAT(x, n)』関数は、文字列 x を n回繰り返して連結する機能です。ここでのポイントは、「元の文字列 x」に「x を n回コピーして追加する」という仕様である点です。つまり、結果として得られる文字列は「元の文字列」+「n回の繰り返し」=「合計 n+1 回分」の長さになります。

他言語(JavaScriptのrepeatメソッドやPythonの文字列乗算など)では n回繰り返すと指定すれば n回分になるのが一般的ですが、PL/Iの仕様では n+1 回分になってしまうため、バッファサイズやレイアウト計算時にオフセットのズレ(バグ)を招きやすいのが特徴です。

3. 実装/解決策

帳票の区切り線(例えば80桁のハイフン)を作成する場合、単純に『REPEAT(‘-‘, 80)』と記述すると、実際には81文字生成されてしまい、後続のデータが1桁右にズレるという事態が発生します。
これを回避するためには、「生成したい回数から1を引いた値」を第2引数に指定するのが正解です。

4. サンプルプログラム

以下に、安全に区切り線を作成し、画面やファイルに出力する際のサンプルコードを記述します。

/ 80桁の区切り線を正しく作成する例 /
DECLARE LINE_80 CHAR(80) VARYING;
DECLARE HYPHEN_CHAR CHAR(1) INITIAL(‘-‘);

/ REPEATの第2引数は「n回追加」なので、全体で80桁にするには79を指定する /
LINE_80 = HYPHEN_CHAR || REPEAT(HYPHEN_CHAR, 79);

/ 結果の確認 /
PUT SKIP LIST(‘作成された文字列の長さ:’ || LENGTH(LINE_80));
PUT SKIP LIST(LINE_80);

/ ビット処理での応用:8ビットのフラグパターンの作成 /
DECLARE BIT_PATTERN BIT(16);
/ ’10’ を7回追加し、全体で16ビットにする /
BIT_PATTERN = ’10’B || REPEAT(’10’B, 7);

5. 応用・注意点

【バグ回避のヒント】
REPEAT関数を使用する際は、必ず LENGTH関数 と組み合わせてデバッグを行うことを推奨します。「思ったより1文字長い」という現象は、仕様を知らなければデバッグで非常に迷うポイントです。

【性能面での注意】
メインフレーム上の大量の帳票処理において、REPEAT関数は非常に高速ですが、ループ内で動的に生成し続けるとメモリの断片化やCPU負荷の増大を招くことがあります。定型的な区切り線であれば、一度生成したものを STATIC変数 に保持し、使い回す設計にすることで、より効率的なプログラムになります。

古い言語仕様には独特の「癖」がありますが、正しく理解すれば強力な武器になります。次回のコーディングで「あれ?1文字多いな?」と思ったら、ぜひこのREPEATの仕様を思い出してください。

コメント

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