perl-5.20.1
substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET

Extracts a substring out of EXPR and returns it. First character is at offset zero. If OFFSET is negative, starts that far back from the end of the string. If LENGTH is omitted, returns everything through the end of the string. If LENGTH is negative, leaves that many characters off the end of the string.

EXPR から、部分文字列を取り出して返します。 最初の文字がオフセット 0 となります。 OFFSET に負の値を設定すると、EXPR の終わりからのオフセットとなります。 LENGTH を省略すると、EXPR の最後まですべてが返されます。 LENGTH が負の値だと、文字列の最後から指定された数だけ文字を取り除きます。

    my $s = "The black cat climbed the green tree";
    my $color  = substr $s, 4, 5;      # black
    my $middle = substr $s, 4, -11;    # black cat climbed the
    my $end    = substr $s, 14;        # climbed the green tree
    my $tail   = substr $s, -4;        # tree
    my $z      = substr $s, -4, 2;     # tr

You can use the substr() function as an lvalue, in which case EXPR must itself be an lvalue. If you assign something shorter than LENGTH, the string will shrink, and if you assign something longer than LENGTH, the string will grow to accommodate it. To keep the string the same length, you may need to pad or chop your value using sprintf.

substr() を左辺値として使用することも可能で、その場合には、 EXPR が自身左辺値でなければなりません。 LENGTH より短いものを代入したときには、 EXPR は短くなり、LENGTH より長いものを代入したときには、 EXPR はそれに合わせて伸びることになります。 EXPR の長さを一定に保つためには、sprintf を使って、 代入する値の長さを調整することが、必要になるかもしれません。

If OFFSET and LENGTH specify a substring that is partly outside the string, only the part within the string is returned. If the substring is beyond either end of the string, substr() returns the undefined value and produces a warning. When used as an lvalue, specifying a substring that is entirely outside the string raises an exception. Here's an example showing the behavior for boundary cases:

OFFSET と LENGTH として文字列の外側を含むような部分文字列が指定されると、 文字列の内側の部分だけが返されます。 部分文字列が文字列の両端の外側の場合、substr() は未定義値を返し、 警告が出力されます。 左辺値として使った場合、文字列の完全に外側を部分文字列として指定すると 例外が発生します。 以下は境界条件の振る舞いを示す例です:

    my $name = 'fred';
    substr($name, 4) = 'dy';         # $name is now 'freddy'
    my $null = substr $name, 6, 2;   # returns "" (no warning)
    my $oops = substr $name, 7;      # returns undef, with warning
    substr($name, 7) = 'gap';        # raises an exception

An alternative to using substr() as an lvalue is to specify the replacement string as the 4th argument. This allows you to replace parts of the EXPR and return what was there before in one operation, just as you can with splice().

substr() を左辺値として使う代わりの方法は、置き換える文字列を 4 番目の 引数として指定することです。 これにより、EXPR の一部を置き換え、置き換える前が何であったかを返す、 ということを(splice() と同様) 1 動作で行えます。

    my $s = "The black cat climbed the green tree";
    my $z = substr $s, 14, 7, "jumped from";    # climbed
    # $s is now "The black cat jumped from the green tree"

Note that the lvalue returned by the three-argument version of substr() acts as a 'magic bullet'; each time it is assigned to, it remembers which part of the original string is being modified; for example:

3 引数の substr() によって返された左辺値は「魔法の弾丸」のように振舞うことに 注意してください; これが代入される毎に、元の文字列のどの部分が変更されたかが 思い出されます; 例えば:

    $x = '1234';
    for (substr($x,1,2)) {
        $_ = 'a';   print $x,"\n";    # prints 1a4
        $_ = 'xyz'; print $x,"\n";    # prints 1xyz4
        $x = '56789';
        $_ = 'pq';  print $x,"\n";    # prints 5pq9
    }

With negative offsets, it remembers its position from the end of the string when the target string is modified:

負数のオフセットの場合、ターゲット文字列が修正されたときに文字列の末尾からの 位置を覚えます:

    $x = '1234';
    for (substr($x, -3, 2)) {
        $_ = 'a';   print $x,"\n";    # prints 1a4, as above
        $x = 'abcdefg';
        print $_,"\n";                # prints f
    }

Prior to Perl version 5.10, the result of using an lvalue multiple times was unspecified. Prior to 5.16, the result with negative offsets was unspecified.

バージョン 5.10 より前の Perl では、複数回左辺値を使った場合の結果は 未定義でした。 5.16 より前では、負のオフセットの結果は未定義です。