perlplusロゴ

substr関数

広告

「substr」関数は対象となる文字列の部分文字列を取得又は置換します。

substr
substr(EXPR,OFFSET[,LENGTH[,REPLACEMENT]])
対象の文字列の部分文字列の取得をします。REPLACEMENTを指定した場合に
は該当の部分文字列を新しい文字列で置き換えます。

パラメータ:
  EXPR  対象の文字列
  OFFSET  文字位置
  LENGTH  文字の長さ
  REPLACEMENT  置換する文字列
戻り値:
  部分文字列

1番目の引数には対象となる文字列を指定します。

2番目の引数には文字列の中の位置を指定します。先頭の文字の位置は「0」です。位置に負の値を指定した場合、最後の文字を「-1」として最後から先頭に向かった移動した位置となります(「-2」の場合は最後から数えて2番目の文字)。

Morningと言う文字の文字位置

 M  o  r  n  i  n  g
--------------------
 0  1  2  3  4  5  6
-7 -6 -5 -4 -3 -2 -1

3番目の引数には文字の長さを指定します。文字の長さを省略した場合には最後の文字までとなります。また負の値を指定した場合には最後の文字を「-1」として先頭に向かって指定した長さだけ戻った位置にある文字の前の文字までとなります。

Morningと言う文字に対してsubstr(1, 2)とした場合は or
Morningと言う文字に対してsubstr(1, -2)とした場合は orni

 M  o  r  n  i  n  g
--------------------
 0  1  2  3  4  5  6
-7 -6 -5 -4 -3 -2 -1

4番目の引数には置き換える新しい文字列を指定します。置き換えの対象となるのは1番目から3番目の引数によって決定した部分文字列となります。この場合は1番目の引数そのものを置き換えるので、置きかえられた新しい文字列が格納できるように1番目の引数は文字列の値ではなく文字列が格納された変数を指定しなければなりません。

具体的には次のように記述します。

my $sub;

$sub = substr("Morning", 2);
print "$sub¥n";

$sub = substr("Morning", -2);
print "$sub¥n";

$sub = substr("Morning", 1, 2);
print "$sub¥n";

$sub = substr("Morning", 1, -2);
print "$sub¥n";

my $targetstr = "Morning";
substr($targetstr, 1, -1, "ORNING");
print "$targetstr¥n";

上記の場合はどちらも「5」を返します。

サンプルプログラム

では簡単なプログラムで確認して見ます。

test2-1.pl

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my $sub;

$sub = substr("Morning", 2);
print "substr(¥"Morning¥", 2) = $sub¥n";

$sub = substr("Morning", -2);
print "substr(¥"Morning¥", -2) = $sub¥n";

$sub = substr("Morning", 1, 2);
print "substr(¥"Morning¥", 1, 2) = $sub¥n";

$sub = substr("Morning", 1, -2);
print "substr(¥"Morning¥", 1, -2) = $sub¥n";

my $targetstr = "Hello Satou";
print "old = $targetstr¥n";
substr($targetstr, 5, 1, " Mr.");
print "new = $targetstr¥n";

上記を「test2-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。

substr関数

( Written by Tatsuo Ikura+ )