Perl Perl_4
Perl 部分文字列の位置を探す index, rindex (0x242)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x242 回。
Perl で、文字列の中から「 部分文字列 」の最初の位置を返す関数「 index 」と、最後の位置を返す関数「 rindex 」を確認する。
部分文字列
Perl では、「 文字 」を並べたものを「 文字列 」と呼びますが、並べていないものも便宜上 ( ? ) 「 文字列 」と呼びます。
(0x08) で確認した通り、最も短い文字列は、「 空文字 ( Empty string ) 」で、最も長い文字列は「 利用可能なメモリを使い果たす長さの文字列 」です。
ある「 文字列 」( string ) のうち、特定部分の文字列のことを「 部分文字列 」( substring ) と呼びます。
例えば、「 Perl is good programing language. 」という文字列があった場合、「 Perl 」や「 good 」といった単語、半端に思える「 ood 」や「 ramin 」、さらに縮めて「 g 」や 「 l 」等のアルファベット、あげくは「 」( スペース ) や「 」 ( 空文字 ) までもが「 部分文字列 」に該当します。
部分文字列の位置を取得する関数「 index 」
Perl では、対象とする文字列の中で、任意の「 部分文字列 」が何番目に位置するのかを確認できる関数「 index 」が用意されています。
関数「 index 」の書式は次のものです。
index STR, SUBSTR, POSITION
index STR, SUBSTR
第 1 引数の「 STR 」は、検索の対象とする「 string 」( 文字列 ) です。
第 2 引数の「 SUBSTR 」は、検索される「 substring 」( 部分文字列 ) です。
第 3 引数の「 POSITION 」は、「 substring 」の検索を開始する位置を指定します。この引数を省略した場合は、先頭から検索します。
関数「 index 」を利用する
関数「 index 」の動作を確認するためのプログラムコードは次の通りです。
# 対象文字列
my $string = "Perl is good programing language.";
# 部分文字列
my $part = "is";
# 検索して位置を取得
my $where = index($string, $part);
# 位置を出力
print "The first position in string is: $where.\n";
8 行目で関数「 index 」を利用しています。関数「 index 」は、最初に部分文字列が見つかった位置 ( position ) を返すので、スカラ変数「 $where 」には先頭から何番目かを意味する数値が格納されます。
なお、位置を表す数値は「 0 」からカウントされます。また、部分文字列が見つからなかった場合、「 index 」は「 -1 」を返します。
上記プログラムコードを実行すると、次の出力が得られます。
The first position in string is: 5.
検索の開始位置を指定する
関数「 index 」の書式にあった通り、第 3 引数には検索を開始する位置 ( position ) を指定可能です。
位置の指定は数値「 0 」をベースとして指定します。
my $string = "Perl is good programing language.";
# substring を g で指定
my $part = "g";
# position を 10 で指定
my $where = index($string, $part, 10);
print "The first position in string is: $where.\n";
3 番目の引数「 POSITION 」を指定しない場合、部分文字列「 g 」は「 8 」番目に位置すると返されますが、検索開始位置を「 10 」としているため、スカラ変数「 $where 」には、位置「 16 」が格納されます。
もし「 POSITION 」を「 17 」と指定した場合は、次の「 g 」の位置「 22 」が返されます。
なお、「 POSITION 」に負の値「 -1 」等を指定した場合は先頭から検索します。
また、「 POSITION 」に対象文字列の長さを超える値を指定した場合、関数「 index 」は末尾から検索を開始するので、通常は「 -1 」( 見つからなかった ) が返されます。
部分文字列の出現位置と回数を確認する
任意の部分文字列が、長い文字列の中でどこに位置しているかの情報と、その出現回数 ( 個数 ) をチェックするプログラムを書いてみました。
# string
my $string = "She sells sea shells by the seashore. The shells she sells are surely seashells. So if she sells shells on the seashore, I'm sure she sells seashore shells.";
# substring
my $part = "she";
# position
my $position = 0;
my $where = 0;
my $cnt = 0;
print "\n--- 'she' position is ---\n";
while ($where >= 0) {
$where = index($string, $part, $position);
next if $where < 0;
print "$where\n";
# position をオフセットする
$position = $where + 1;
$cnt++;
}
print "number of pieces: $cnt\n";
print "--- end string ---\n\n";
プログラムの実行結果は次の通りです。
--- 'she' position is ---
14
42
49
73
87
97
130
149
number of pieces: 8
--- end string ---
関数「 rindex 」
文字列の先頭から position を検索する関数「 index 」とは反対に、文字列の末尾から position を検索する「 rindex 」という関数があります。
前項のプログラムコードを関数「 rindex 」のために書き換えると次のようになります。
my $string = "She sells sea shells by the seashore. The shells she sells are surely seashells. So if she sells shells on the seashore, I'm sure she sells seashore shells.";
my $part = "she";
# 文字列の末尾より後ろを指定
my $position = 999;
my $where = 0;
my $cnt = 0;
print "\n--- 'she' position is ---\n";
while ($where >= 0) {
# index の代わりに rindex を利用する
$where = rindex($string, $part, $position);
next if $where < 0;
print "$where\n";
# position を index と逆方向にオフセットする
$position = $where - 1;
$cnt++;
}
print "number of pieces: $cnt\n";
print "--- end string ---\n\n";
実行結果は次の通りです。
--- 'she' position is ---
149
130
97
87
73
49
42
14
number of pieces: 8
--- end string ---
関数「 index 」とは逆の順番で検索されていることがよくわかります。
0x242 -> 0x243 へ
次回は、関数「 index 」を利用して、Perl における「 日本語文字列 」( Unicode ? ) の扱いを確認してみます。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)