Perl5 リファレンス



substr

【文法】

substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET
substr EXPR,OFFSET,LENGTH,REPLACEMENT

【説明&用例】

文字列(EXPR)から、OFFSET で与えられた位置から数えて LENGTH で与えられた文字数
分の部分文字列を抜き出し、それを返します。最初の文字のオフセットは、0 となります。
または、`$[' にセットされた場所です。(しかしそうしないで下さい。)もし OFFSET 
が負の値(さらに正確に言うと、`$[' より小さい値)だった場合、文字列の最後から数
えて OFFSET 分からスタートします。もし LENGTH が省略された場合、文字列の最後まで
すべてを返します。もし LENGTH が負の値なら、文字列の最後から LENGTH で指定した文
字数分を切り抜いた部分文字列を返します。

    my $string = 'ABCDEFG';
    my $substring = substr $string, 3, 2;

    この場合、'ABCDEFG' という文字列の 3 番目の位置(OFFSET)から 2 文字分の長さ
    (LENGTH)を抜き取り、スカラー変数 $substring に格納します。従って部分文字
    列 $substring には、'DE' が格納されます。

    my $substring = substr $string, -4, 3;

    この場合、開始位置(OFFSET)が負の値 -4 ですから、最後から数えて 4 番目の位
    置から右へ 3 つ分の文字列が抜き出され、スカラー変数 $substring に格納されま
    す。従って、部分文字列 $substring には、'DEF' が格納されます。

    my $substring = substr $string, 3;

    この場合、抜き出す長さ(LENGTH)が省略されていますので、3 番目の位置(OFFSET)
    から最後までが抜き出され、スカラー変数 $substring に格納されます。従って部分
    文字列 $substring には、'DEFG' が格納されます。

    my $substring = substr $string, 3, -2;

    この場合、まず開始位置(OFFSET)が 3 ですから、3番目の 'D' から最後までの文
    字列 'DEFG' を取り出します。切り取る長さ(LENGTH)が -2 ですから、先ほど取り
    出した 'DEFG' の最後から 2 文字分を切り取ります。残った文字列 'DE' がスカラ
    ー変数 $substring に格納されます。


EXPR が 左辺値(lvalue) である場合は、substr() を 左辺値(lvalue) として使うことが
できます。LENGTH より短い文字列を割り当てた場合、文字列は短くなるでしょう。
LENGHT より長い文字列を割り当てた場合、文字列はそれに適応するように長くなるでし
ょう。同じ長さに文字列を保つために、sprintf 関数を使って埋め合わせるもしくは切り
落とす必要があるでしょう。

OFFSET と LENGTH が、部分的に文字列の範囲外となるような部分文字列を指定している
場合には、文字列の範囲内の部分のみが返されます。もし部分文字列が文字列の最後を越
えているなら、substr() は、未定義値を返し、警告を発します。lvalue として使われた
場合には、文字列から完全に外れている部分文字列を特定することは、致命的エラーとな
ります。このような境界性のケースにおける動作を確認できる例をここにあげます。

    my $name = 'fred';
    substr($name, 4) = 'dy';            # この時点で $name は 'freddy'
    my $null = substr $name, 6, 2;      # '' が返されます (警告は出ません)
    my $oops = substr $name, 7;         # undef が返されます(警告が出ます)
    substr($name, 7) = 'gap';           # 致命的エラーとなります

左辺値(lvalue) として substr() を使うとう選択は、第 4 引数として置き換え文字列を
指定することです。EXPR の一部分を置き換え、一度の操作で以前そこにあったものを返
します。ちょうど、splice() を使ったときのように。




Perl5リファレンスに戻る