第14章. 文字列とソート
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
本書の冒頭で述べたように、Perlは90%がテキスト処理、10%がそれ以外の処理であるようなプログラミングの問題を解決するのに適しているように設計されている。だからPerlが強力なテキスト処理能力を持っているのは、正規表現を使ったことがなくても驚くことではない。時には正規表現エンジンが派手すぎて、文字列を扱うもっとシンプルな方法が必要になることもある。
インデックスで部分文字列を発見する
部分文字列の発見は、それをどこで見失ったかによる。たまたま大きな文字列の中で見失ってしまった場合は、index 関数が助けてくれる。こんな感じだ:
my $where = index($big, $small);
Perlは、大きな文字列の中で小さな文字列が最初に出現する場所を探し、最初の文字の位置を整数で返す。文字列の先頭で部分文字列が発見された場合、index は0 を返し、1文字後に発見された場合は1 を返す。もしindex が部分文字列をまったく発見できなければ、-1 を返す。この例では、wor が始まる位置なので、$where は6 を返す:
my $stuff = "Howdy world!"; my $where = index($stuff, "wor");
位置番号の別の考え方は、部分文字列に到達する前にスキップする文字数である。$where は6 なので、wor を発見する前に、$stuff の最初の6文字をスキップしなければならないことがわかる。
index 関数は常に、最初に発見された部分文字列の位置を報告する。しかし、オプションの第3パラメータを使用することで、文字列の先頭よりも後の位置から検索を開始するように指示することができる。index :
my $stuff = "Howdy world!"; my $where1 = index($stuff, "w"); # $where1 gets 2 my $where2 = index($stuff, "w", $where1 + 1); # $where2 gets 6 my $where3 = index($stuff, "w", $where2 + 1); # $where3 gets -1 (not found)
この3番目のパラメータは、事実上戻り値の最小値を与えている。部分文字列がその位置以降にない場合、index は-1 を返す。ループなしでこれを行うことはないだろう。この例では、位置を格納するために配列を使っている:
use v5.10;
my $stuff = "Howdy world!";
my @where = ();
my $where = -1;
while( 1 ) {
$where = index( $stuff, 'w', $where + 1 );
last if $where == -1;
push @where, $where;
}
say "Positions are @where";$where を-1 に初期化するのは、index に開始位置を渡す前に1 を追加するからである。これは、最初のパスが特殊化ではないことを意味する。
たまに、部分文字列の最後に出現した文字列を取得したい場合がある。 rindex 、文字列の最後からスキャンを開始する。この例では、最後のスラッシュを発見することができる。スラッシュは文字列の位置 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access