blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_4

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

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)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲