文字列データ

文字列値とは、文字のシーケンスです。シーケンス内の文字の数のことをシーケンスの長さと呼びます。Open PL/I では、文字列値の最大長さは 32767 バイト (文字) です。

長さゼロの文字列は null 文字列と呼ばれます。

文字列変数または文字列値を使用する関数は、次の属性を使用して宣言します。

CHARACTER(n)

または

CHARACTER(n) VARYING

または

CHARACTER(n) VARYINGZ

n は、変数で保持できる、または関数から返すことができるすべての文字列値の最大の長さです。

VARYING (VAR) 属性を指定すると、文字列変数または関数で可変長の値を保持または返すことができます。内部的には、可変長文字列の長さが値とともに記録されます。可変長文字列の場合、最大長さ n に合わせて空白詰めされることはありません。記憶域における可変長文字列変数の表現では、変数は最大 n 文字を持つことができ、現在の文字列の長さは、値の一部として保持されます。

VARYINGZ (VARZ) 属性を指定すると、文字列変数または関数で可変長の値を保持または返すことができます。varyingz 文字列は、内部的には、'00'x バイトで終了する文字のシーケンスとして格納されます。最大長さ n に合わせて空白詰めされることはありません。記憶域における可変長文字列変数の表現では、変数は最大 n 文字を持つことができます。

VARYING 属性がない場合、文字列変数または関数は、常に n の長さの値を保持または返します。非可変長文字列への割り当てでは常に、長さが短い値の右側に空白が追加され、n 文字の長さまで拡張されます。

n を上回る文字数の文字列を、可変長または非可変長の文字列変数に割り当てた場合、左側の n 文字だけが割り当てられ、残りの文字は切り捨てられます。

文字列値は、コンピューターの照合順序を使用して左側から右側に向かって比較されます。長さが同一でない文字列を比較するときには、右側に空白を付加されて短いほうの文字列が拡張されます。

非可変長の文字列変数は常に n バイトの記憶域を使用します。配列の要素または構造体のメンバーである場合は、次に使用可能なバイトから開始され、語またはその他の記憶アドレスの境界に合わせて整列されることはありません。そのため、非可変長の文字の配列は、単一の文字列であるかのように格納およびアクセスできます。詳細は、「記憶域クラス」の章にある「Storage Sharing」のセクションを参照してください。

可変長の文字列変数は常に n+2 バイトの記憶域を使用します。最初の 2 バイトに、現在変数に格納されている文字列の長さを指定する整数 L (0 <= L <= n) が格納されます。長さの 2 バイトに続き、文字列のテキストが先頭の L バイトの記憶域に格納されます。変数の最後の n-L バイトは未定義です。値 L には LENGTH 組み込み関数を使用してアクセスできます。可変長文字列の配列は、単一の文字列であるかのようにアクセスできません。

varyingz の文字列変数は常に n+1 バイトの記憶域を使用します。varyingz 文字列の現在の長さ L は、最初の '00'x バイトの位置によって決まります (L = index(string, '00x') – 1)。終端文字 '00x' に続き、文字列のテキストが先頭の L バイトの記憶域に格納されます。変数の最後の n-L バイトは未定義です。値 L には LENGTH 組み込み関数を使用してアクセスできます。varyingz 文字列の配列は、単一の文字列であるかのようにアクセスできません。

可変長文字列の整列については、『Open PL/I ユーザー ガイド』を参照してください。

文字列定数は次の形式で書き込まれます。

'引用符以外の任意の文字'

定数内にアポストロフィが必要な場合は、隣接する一組のアポストロフィとして書き込む必要があります。

例:

'ABC'
'He said, "I don"t know."'
''

2 つ目の例では、文字列「don't」の中で一組の単一引用符が使用されています。この例は、二重引用符が文字列定数の区切り文字と見なされないことも示しています。最後の例の文字列は null 文字列です。

注: 中間結果として生成されるすべての文字列には、スタックに割り当てられた記憶域も必要です。ALLOCATE 文ではシステム領域の記憶域が必要になります。利用可能な記憶域より大きな一時記憶域を割り当てると、ERROR 状態のシグナルが発生します。