1. 導入:なぜSUBSTR疑似変数が重要なのか
メインフレームのPL/I開発において、文字列の一部だけを差し替えたい場面は多々あります。例えば、「固定長レコードの特定の列だけを更新する」といったケースです。通常、文字列を分割して結合し直すという手順を踏みがちですが、SUBSTR疑似変数を使えば、まるでメモリを直接操作するかのように、元の文字列を維持したまま特定箇所だけを書き換えることができます。コードが劇的にシンプルになり、メンテナンス性も向上するため、ぜひ習得しておきたいテクニックです。
2. 基礎知識:疑似変数(Pseudo-variable)とは?
通常のSUBSTR関数は、文字列から特定の部分を取り出すためのものですが、代入文の「左辺」に置くことで、その働きが「部分代入」へと変化します。これを疑似変数と呼びます。
JavaやTypeScriptなどの現代的な言語では、文字列は「不変(イミュータブル)」であるため、一度作成した文字列の一部だけを変えることはできません。必ず新しい文字列を作り直す必要があります。しかし、PL/Iのようなメインフレーム言語では、メモリ上のバッファを直接指定して書き換えることが可能なのです。
3. 実装・解決策
使い方は非常にシンプルです。代入文の左辺に「SUBSTR(対象文字列, 開始位置, 長さ)」を記述し、右辺に代入したい値を置くだけです。
注意点として、指定した長さよりも代入する値が短い場合は、自動的にパディング(空白埋め)が行われます。逆に長い場合は、指定した長さに切り詰められるため、メモリ破壊の心配はありませんが、意図したデータになっているか確認が必要です。
4. サンプルプログラム
以下のコードは、固定長のメッセージデータの中間部分だけを安全に差し替える例です。
/ 動作確認用サンプルコード /
TEST_SUBSTR: PROCEDURE OPTIONS(MAIN);
/ 20バイトの固定長文字列を定義 /
DCL BUFFER CHAR(20) INIT(‘ABCDE12345FGHIJ67890’);
PUT SKIP LIST(‘更新前: ‘ || BUFFER);
/
- 10番目の文字から5文字分を’NEWVAL’で上書きする
- 実際には’12345’の部分が’NEWVA’に置き換わります
- ※指定長が5のため、’NEWVAL’の6文字目は切り捨てられます
/
SUBSTR(BUFFER, 10, 5) = ‘NEWVAL’;
PUT SKIP LIST(‘更新後: ‘ || BUFFER);
END TEST_SUBSTR;
5. 応用・注意点
この機能は非常に強力ですが、他の言語への移行を考える際には注意が必要です。もし将来的にJava等へマイグレーションする計画がある場合、この「部分書き換え」ロジックは他の言語ではそのまま通用しません。
移行時には StringBuilderクラスのreplaceメソッド を使うか、文字列を分割して連結するロジックに書き直す必要があります。
また、ビット列に対しても同様の操作が可能です。ビット・ストリングの特定のフラグだけを立てる際にもSUBSTR疑似変数は役立ちます。効率的なコードを目指すなら、ぜひこの「メモリ直接操作」の感覚をマスターしてください。

コメント