Perl/CGIプログラムの文字列操作関数(2)

今回のPerl/CGIプログラミング学習は、前回のsplit関数に引き続いて…。

Perl/CGIプログラミングに存在する、数ある文字列操作関数の中から、いくつかピックアップして学習していきます。

  1. 編集前記
  2. join関数
  3. length関数
  4. substr関数
  5. index関数とrindex関数
  6. 編集後記

編集前記

今回の編集前記は、「今このタイミングで、 Perl/CGIプログラミングを学習 しておきましょう」という話をします。

前回で所信表明をしたので、まぁその続きとでも思っておいてください。

これからは、今以上にPerl/CGIプログラムの知識が生かされてくると思います。

ご存知のとおり、Perl/CGIというのはインターネットサーバーサイドで動作するプログラミング言語です。

そしてそのインターネット利用者は、どんどん増加しています。

インターネットが身近なものとなり、今やネットなくしては生活していけないという人もいるでしょう。

そんなインターネットがもたらしたものというのは、周りにはいろいろあると思うのですが…。

その中でも、一番感じていることをお話していきますね。

インターネットがもたらした最も大きな影響とは、「個人の好みの分散と促進」ではないでしょうか?

一言で表現するなら…。

インターネットがもたらした大量の情報によりどんなものでも比較検討する幅が広がり、そこから自然とこだわりが生まれ、さらにそれを追求し始めた人が増えたということです。

もっとばっさり表現してしまえば、みんなオタク思考になったということです。

例えば、一般向けに幅広く売られている商品よりも、自分のこだわりをかなえてくれる商品をインターネットで検索して購入するようになりました。

個人的な例で申し訳ないのですが…。

個人でパソコンを買うとき、パソコンショップに足を運んでパソコンを買うのではなく、パソコンメーカーの直販サイトで、パソコンを注文するようになりました。

というのも…。

パソコンショップに並んでいる有名メーカーで使いやすそうだけども、余計な機能までついているものよりも…。

インターネット上で自分好みのパーツを選択し、余計な機能にはお金をかけないスタイルの法が合ってると思ったからですね。

もちろん、いろんなメーカーのパソコンを一度に見たいとか、店員とのナマの情報をやり取りしてから購入したいなど…。

リアルな店舗ならでわのよいところがありますから、決して全否定しているわけではないです。

むしろ、気になるパソコンの外見を確かめに、足を運んで店員さんといろいろ話をしたりもしています。

あくまでも、購入スタイルの話です。

今この記事を書いているパソコンも、ノートパソコンなのですが、インターネット上からオーダーメイドで購入したものです。

まさか当たり前に、パソコンを使ってパソコンを購入する時代が来るとは、少し驚きですが(笑)。

インターネットはそのぐらい便利なものであり、すでに、経済が回っていく仕組みがそこにはあるということです。

ほかにも、インターネットがこれから延びてくる理由としては…。

テレビ放送とインターネットの関係の変化が挙げられます。

少し前までは、微妙にしか面白くないテレビ番組を家族みんなで見るのが当たり前でした。

強制的におもしろくもないコンテンツを提供されていたわけです。

しかし、インターネットのコンテンツがその常識を変えました。

みんなが強制的にみせられていた微妙にしか面白くなかったコンテンツではなく、自分だけがおもしろいと感じるコンテンツをインターネットで検索して見るようになったのです。

強制的に見せられていたコンテンツから、自分が面白いと感じるコンテンツへと、人の動きは少しずつですが確実に変化しています。

その動きはこれからもどんどん強くなっていくことでしょう。

聞くところによると、現在視聴率20%を超えるテレビ番組が無くなって来ているそうですね。

人の流れが少なくなれば、当然、そこに費やすお金も少なくなります。

スポンサー離れが起きてくるわけです。

実はこの現象というのは、すでにアメリカで90年代に起きています。

原因は多チャンネル化と面白い番組が減ったことによるものです。

まさに今、日本で起こっている現象そのものですよね。

テレビ業界は衰退路線を一直線。

それに対して、インターネット業界は年々大きくなってきている。

これは、あおりとかでもなんでもなく、少し調べていただければわかることだと思います。

そしてもうひとつ大切なポイントは、そのコンテンツを作っているほとんどが企業ではなく個人だというところです。

個人が作り上げたコンテンツから面白さを見つけ出した人たちがそれを広めていく。

昨今のインターネットでは、このような図式が成り立っています。

インターネットが利用され始めたころというのは、大企業がマネーパワーでサービスを展開し、利用者を囲い込んでいました。

個人でもホームページを持つことはできましたが、今のように膨大なアクセスを集める手段はほとんどありませんでした。

ですから、企業サイトと個人サイトでは力関係にものすごくひらきがありました。

ちょうど、理科の時間に学習しました食物連鎖のピラミッド図のような感じです。

集客とコンテンツに力のある企業のページが数少ない頂点部で、大量の個人ページが底辺部に位置する感じですね。

しかし、前述のような個人の好みの分散化により、面白いコンテンツを展開している個人と、それを面白いと感じる人が増えてきました。

いくつかある動画サイトなどがいい例ですよね。

ニコニコ動画に投稿された作品がきっかけで、CDが発売されたり、ちょっとしたイベントが開催されたりしています。

初音ミクの普及とそれに関連したコンテンツの広がりもそうですよね。

これらはおたくの人しかわからないネタかもしれませんが…。

そんな感じで、企業個人関係なく、今はコンテンツの質が問われる時代になったのです。

そうなると力関係はどうなってしまうのかというと…。

先ほどの食物連鎖のピラミッド図形は崩れ去り、コンテンツ力のある個人サイトと企業サイトが拮抗もしくは逆転するといったことが起こるようになります。

これが何を意味しているのかはおわかりですよね。

つまり、企業・個人関係なく、インターネットの世界ではコンテンツ力が重要だという時代が来たということです。

そしてこのような現象を底辺部で支えているのが、個人でもコンテンツを作成するんだという意識の高さです。

もう、自分で何かを作り上げて発信することが当たり前なわけです。

もしくは、自分たちがコンテンツの一部となり、そこに賛同してくれる人たちとともに自分たちの世界を作ることが当たり前なわけです。

このように、もはやインターネットはその地位を確立し、みんながコンテンツを生み出す時代になりつつあるのです。

冗談ではなく本当に、日本国民総アーティスト時代がやってくるのです。

そんな時代にあなたはどうしますか?

このページでは、あなたにもプロ顔負けのコンテンツを作れとは言いません。

そんなもの、なかなか作れません(苦笑)。

でも何かひとつでも、インターネットを使って自分を表現できる手段を身につけておいた方がよいのは確かですよね。

そこで提案するのが、あなたのコンテンツの基礎システムとなるPerl/CGIプログラムの知識です。

なんだか我田引水のように感じるかもしれませんが…。

インターネット自体がコンピューターネットワークでできていることと、それを制御しているのが各種のプログラム言語ですから、納得していただけるかと思います。

今やインターネットで何かをしようと思った場合、Perl/CGIに限らず、プログラムの知識はほぼ必須だといえます。

やり方によっては、Perl/CGIプログラム自体がコンテンツとなる場合があります。

たとえそこまでいかなかったとしても、Perl/CGIプログラミングの知識は、あなたのコンテンツの基礎を支えてくれるシステム構築の手助けになるはずです。

ものすごく詳しくなれとは言いませんが、自分が何かしようと思ったときに困らない程度の知識は必要ではないでしょうか?

まぁこれは極端な話かもしれませんが、ここで言いたいことはなんとなくでも理解していただけるかと思います。

それでは、今回のPerl/CGIプログラミング学習に移りましょう。

join関数

Perl/CGIプログラム のjoin関数は、複数の値を接合値を使って、ひとつの値につなげ合わせる関数です。

これも英単語の意味そのままですから、覚えやすいと思います。

ちょうど、前回学習しました split関数 とは逆の働きをします。

「文字列 = join (接合値, 値1, 値2, 値…)」という感じで使用します。

join関数への第一引数には接合値。

第二引数からは接合値を使ってつなげたい値がきます。

接合値には文字や文字列、記号や16進数なども使えます。

第二引数からの値については、ひとつひとつをカンマで区切るか、 配列 で指定します。

join関数の使い方(1)

まずは、一般的なjoin関数の使い方から…。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my @word = ('Perl', 'CGI');
my $word = join ('/', @word);
print $word;
exit;

このPerl/CGIプログラムを実行すると「Perl/CGI」と表示されます。

配列「@word」の…。

1つ目の要素「Perl」。

2つ目の要素「CGI」。

これらを「/」を接合値として、ひとつの文字列につなぎ合わせています。

ちょうど、配列の並び順でつなげられるのでわかりやすいですね。

配列「@word」の並び順を逆にしたいときは、reverse関数を使えば要素が逆になります。

「my $word = join ('/', reverse(@word));」という感じです。

reverse関数については、以前ループ処理 のところでやりましたよね。

忘れてしまった場合は復習しておいてくださいね。

join関数の使い方(2)

次は、配列ではなく スカラ変数 で、join関数を使ってみます。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $word1 = 'Perl';
my $word2 = 'CGI';
my $word = join ("<br>\n", $word1, $word2);
print $word;
exit;

このPerl/CGIプログラムを実行すると…。

Perl
CGI

このように、2行に分けて表示されます。

接合値を「<br>\n」にしたため、変数「$word1」と「$word2」の間に、 HTMLの改行タグ 「<br>」と、テキストデータの改行コード「\n」が入ったからですね。

接合値にはこのほかにも、16進数なども使えます。

前回少しだけ登場しました「\x」で始まるコードのことですね。

これで、join関数は終了です。

<戻る>

length関数

Perl/CGIのlength関数とは、指定した文字列の長さをバイト数で返す関数です。

書式は「バイト数 = length (文字列)」と、こんな感じです。

ものすごくシンプルですから、これ以上説明する必要ないぐらいですが、バイト数という概念についてだけ補足説明しておきます。

バイト数とは、一言であらわすと「データの量」のことです。

バイト長といったりもしますが、同じものだと思ってください。

8ビットで1バイト。

千バイトで1キロバイト。

千キロバイトで1メガバイト。

千メガバイトで1ギガバイト。

千ギガバイトで1テラバイト。

コンピューターで使われているデータの単位の流れはこんな感じです。

メガバイト(M)とか、ギガバイト(G)などは目にしたことがあるかと思います。

これらはすべて、データの量を表した単位です。

そして、文字列にもデータ量が存在します。

基本的には文字列がながければ長いほど、データ量もそれに比例して増えていきます。

基本的にと書いたのは、例外的なものがあるからですね。

その例外的なものというのは、1文字を表現するために使われているバイト数に差があるときです。

例え同じ文字数でも、1文字あたりにかかるバイト数がちがえば当然、文字列全体のバイト数は変わってきます。

具体的に説明したほうがわかりやすいと思うので、以下のPerl/CGIプログラムを見てください。

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print length('ABCD');
exit;

このPerl/CGIを実行すると「4」と表示されます。

length関数を使って、文字列「ABCD」のバイト数を求めています。

そして返された値が「4」ですから4バイト。

4文字で4バイトですから、1文字1バイトですね。

0バイトの文字なんて存在しませんから、この話はわかりやすいかとおもいます。

このように、半角英数字や記号は1文字1バイトと決められています。

そうしたほうが、計算しやすいからですね。

これに対して日本語文字は、1文字ほぼ2バイト使います。

例外もありますが、日本語文字を表現するには、1文字2バイトというのがほとんどです。

以下のPerl/CGIプログラムを見てください。

#!/usr/bin/perl

print "Content-type: text/html\n\n";

print length('あいうえ');

exit;

このPerl/CGIプログラムを実行すると、「8」と表示されます(Shift_jisコードの場合)。

同じ4文字ですが、こちらは8バイトかかっています。

1文字2バイトです。

length関数を使用する上でまずは、半角文字と全角文字とではこのような違いがあることを知っておきましょう。

コンピューターやプログラムというのは、英語で使用する際に使いやすく作られています。

ですから、Perl/CGIプログラミングで日本語を使う場合には、まずはこのようなことに注意しなくてはいけないことを覚えておきましょう。

Perl/CGIプログラミングで日本語を使う上での注意はほかにもまだまだあります。

まぁでもすべて書いていたらバイト数がとんでもないことになってしまいますので、別の機会に少しずつ紹介していきますね。

この国でPerl/CGIプログラムを作成する以上、とても大切なスキルですからね。

length関数については以上です。

substr関数

Perl/CGIのsubstr関数は、文字列の置換や、文字列の抽出を行う関数です。

操作によって書式が違います。

まずは1つ目、指定文字列の削除と挿入(文字置換)の書式には主に2パターンあります。

「substr (文字列, 開始位置, 操作範囲, 挿入文字列)」

「substr (文字列, 開始位置, 操作範囲) = 挿入文字列」

続いて2つ目、指定文字列の抽出の書式です。

「抽出文字列 = substr (指定文字列, 開始位置, 操作範囲)」

「文字列」や「指定文字列」には、substr関数で操作する値がきます。

基本的にはどんな文字列でも操作できます。

注意すべき点は、1つ目の書式で紹介しました文字置換の場合には、直接この値が操作されてしまうというところです。

「開始位置」には、文字列の何バイト目から操作を始めるかを指定します。

開始位置の指定は、文字列の開始もしくは、末尾から指定します。

どちらも文字数ではなく、バイト数が基準になっているところがポイントです。

「操作範囲」には、開始位置から何バイトのデータを操作するかを指定します。

または、開始位置には関係なく、文字列末尾から操作終了位置をバイト数で指定することもできます。

省略された場合は、自動的に文字列末尾までが操作範囲になります。

「挿入文字列」は、読んだ意味そのままで挿入したい値を指定します。

「抽出文字列」も読んだ意味そのままで、指定文字列から取り出された文字列ですね。

それでは具体的に、substr関数の使い方をみていきましょう。

substr関数の置換操作

まずは、substr関数で文字または文字列を置換する方法についてみていきましょう。

いくつかの方法があります。

基本的な使い方

まずは基本的な使い方から見ていきましょう。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $alphabet = 'abcdefghijklmn';
substr ($alphabet, 3, 4, 'DEFG');
print $alphabet;
exit;

このPerl/CGIプログラムを実行すると「abcDEFGhijklmn」と表示されます。

「substr ($alphabet, 3, 4, 'DEFG');」という部分を…。

「substr ($alphabet, 3, 4) = 'DEFG';」と書き換えても実行結果は同じです。

変数「$alphabet」にセットされた文字列「abcdefghijklmn」を操作して…。

「abcDEFGhijklmn」としました。

substr関数を使って、小文字の「defg」を切り取り、大文字の「DEFG」を切り取った部分に挿入しました。

substr関数部分は「substr ($alphabet, 3, 4, 'DEFG');」または…。

「substr ($alphabet, 3, 4) = 'DEFG';」ですから…。

開始位置は3バイト目といきたいところですが…。

substr関数の場合の開始位置とは、「○バイト目までを無視する」という意味で使われていますから、この場合は…。

「3バイト目までを無視する」ということになり、実際には4バイト目から操作されることになります。

つまり…

1バイト目から操作したい場合は0。

2バイト目から操作したい場合は1。

4バイト目から操作したい場合は3になるわけです。

そして問題の4バイト目の文字とは、「d」ですね。

このあたりの理屈は、前述のlength関数で解説したとおりです。

次は操作範囲の話に移ります。

こちらは「4」が指定されています。

操作範囲は4。

つまり、開始位置から4バイト分のデータを切り取るということになります。

それで切り取られたデータというのが「defg」ということになるわけです。

そして最後に、大文字の「DEFG」という文字列が指定されていますから、先ほど切り取った部分に貼り付けてsubstr関数終了です。

ちなみに、切り取ったバイト数と、挿入するバイト数は一致させる必要ありません。

ここではわかりやすくするために一致させただけですから。

もし…。

「substr ($alphabet, 3, 4, 'DEFG123');」

「substr ($alphabet, 3, 4) = 'DEFG123';」

とした場合は「abcDEFG123hijklmn」となります。

一部省略した使い方

次に、操作範囲を省略したsubstr関数についてみていきましょう。

ちなみに、操作範囲を省略すると開始位置から文字列末尾までの指定になります。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $alphabet = 'abcdefghijklmn';
substr ($alphabet, 3) = 'DEFG';
print $alphabet;
exit;

このPerl/CGIプログラムを実行すると「abcDEFG」と表示されます。

substr関数部分は「substr ($alphabet, 3) = 'DEFG';」ですね。

開始位置は先ほどと同じ「3」を指定し、操作範囲のみを省略しました。

開始位置は先ほどと同じですから、「d」からですね。

そして今回は、文字列の操作範囲が指定されていませんから、自動的に文字列末尾までが操作範囲となります。

したがって、「d」から「n」までが切り取られ、大文字の「DEFG」に置き換えられたというわけです。

指定基準を変更した使い方

次は、開始位置や操作範囲の指定基準位置を変更した、substr関数の使い方についてみていきましょう。

今までは、開始位置の基準は文字列の先頭つまり、左から数えていましたよね。

操作範囲も、開始位置を先頭に計算していました。

しかし、文字列自体が長いなど左側から数えづらい場合には、文字列右側つまり、末尾からのバイト数からの指定に切り替えることができます。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $alphabet = 'abcdefghijklmn';
substr ($alphabet, -5, -1, 'JKLM');
print $alphabet;
exit;

このPerl/CGIプログラムを実行すると「abcdefghiJKLMn」と表示されます。

substr関数の「substr ($alphabet, -5, -1, 'JKLM');」部分を…。

「substr ($alphabet, -5, -1) = 'JKLM';」と書き換えても実行結果は同じです。

開始位置と操作範囲の指定にマイナスをつけることにより、文字列の右側つまり、末尾からのバイト数に切り替えています。

開始位置は「-5」。

これは、文字列末尾から数えて5バイト目「j」をさしています。

操作範囲は「-1」。

これもマイナスがついているので、文字列の末尾から数えます。

開始位置に関係なく文字列末尾から数えるので、今回のようにマイナスがついている場合は、操作範囲というよりも、終了位置といったほうが正確ですね。

さて、その終了位置なのですが、文字列末尾から数えて1バイト目なので、最後の文字「n」といきたいところですが違います。

本来操作範囲を表す値にマイナスがついて終了位置に変化した場合は、マイナスがついていないときの開始位置と同様の意味を持ちます。

つまり、「○バイト目までは無視する」という扱いになるということです。

したがって、「1バイト目までは無視する」ということになり、末尾1バイト目までは無視されます。

その結果、末尾から数えて2バイト目までが切り取られることになるわけです。

そうして切り取られたのは「jklm」ですね。

そして、大文字の「JKLM」をその部分に挿入するので…。

結果「abcdefghiJKLMn」と表示されたというわけです。

substr関数の抽出操作

次に、substr関数で文字または文字列から、指定した文字または文字列を抽出する方法についてみていきましょう。

実はここで解説する部分というのは、すでにsubstr関数を使った文字置換で学習済みになっています。

なぜだかは、プログラムコードを見ればわかります。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $alphabet = 'abcdefghijklmn';
print substr ($alphabet, 3, 4);
exit;

このPerl/CGIプログラムを実行すると「defg」と表示されます。

substr関数部分は、「print substr ($alphabet, 3, 4);」なのでほぼ最初に出てきた置換処理のままですよね。

頭にprint関数がついていたり、置換文字列が指定されていなかったりしてますが、ほぼ最初に説明しました置換操作と同じです。

文字列はもちろん、開始位置や操作範囲などの考え方も同じです。

違う部分は、挿入文字列が指定されていないので、何も挿入されないということ。

それと、頭にprint関数があるので、substr関数から返された値は直接出力されるというところです。

もちろん、print関数の代わりに、スカラ変数を用意しておくこともできます。

その場合は「my $string = substr ($alphabet, 3, 4);」という感じですね。

どちらでもOKです。

さらに、開始位置や操作範囲の値にマイナスをつけて、文字列の右側から抽出位置を指定することもできます。

実際にプログラムコードを書いて説明したいのですが、いつものようにスペースがなくなってきたので各自復習しておいてください。

substr関数については以上です。

index関数とrindex関数

次は、文字列を検索する関数についてみていきましょう。

文字列を検索する関数には、index関数とrindex関数があります。

2種類あるので一見覚えるのが大変そうですが、実はそうでもなく、このindex関数とrindex関数というのは、2つセットで覚えておくような関数です。

それではいきましょう。

書式と解説

index関数とrindex関数は、同じ書式で動作のみが違います。

ですから、まとめて解説していきますね。

書式

index関数の書式はこんな感じです。

「index (全体文字列, 検索文字列, 開始位置)」

rindex関数の書式はこんな感じ…。

「rindex (全体文字列, 検索文字列, 開始位置)」

関数名が違うだけで、あとは同じですよね。

「全体文字列」には、当たり前ですが検索もとの文字列がきます。

「検索文字列」には、検索したい文字または文字列がきます。

「開始位置」は省略可能で、もし省略された場合には、先頭から検索されます。

解説

index関数は、「全体文字列」の中で、「開始位置」の位置から「検索文字列」が最初に出現する位置を返します。

これに対してrindex関数は、「全体文字列」の中で、「検索文字列」が最後に出現する位置を返します。

検索文字列の合致部分が、最初か最後かというだけの違いです。

検索して見つからなければ、どちらも「-1」を返します。

そして、検索文字または文字列の出現位置というのは、値「0」からスタートし、検索し続けたバイト数が返されます。

数値の読み取り方に関しては、前述のsubstr関数の文字位置指定と同じ感覚です。

つまり、半角英数や半角記号であれば、1文字1バイトという感覚でOKですが…。

日本語などの全角文字では、1文字当たりShift_jisやEUC-JPであれば約2バイト、UTF-8では約3バイトかかっていますから、少し注意が必要だということです。

このような、日本語を使ったPerl/CGIプログラミングの感覚に関しては、また別の機会に書くことにしまして、ここではまず半角文字を使っていきます。

まずは、index関数の使用例から…。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $string = 'abcdefgabcdefg';
my $search = 'def';
print index ($string, $search);
exit;

このPerl/CGIプログラムを実行すると、「3」と表示されます。

検索文字列「def」がはじめてヒットするまでに、3バイトのデータをスルーしたということになります。

見てわかるように、検索文字列「def」は4バイト目から始まっていますから「○文字目にあります。」と表記する場合には、表示する前に1を足してやる必要があるので注意しましょう。

続いて、rindex関数の使用例です。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $string = 'abcdefgabcdefg';
my $search = 'def';
print rindex ($string, $search);
exit;

このPerl/CGIプログラムを実行すると、「10」と表示されます。

先ほどのindex関数部分を、rindex関数に変えただけで、あとはなにもかわっていません。

rindex関数ですから、検索文字列「def」が最後にヒットするまでに、何バイトのデータをスルーしたかを返しています。

実行結果は「10」ですから、10バイトのデータをスルーし、11バイト目からヒットしたことになります。

文字列検索のindex関数および、rindex関数の解説は以上です。



編集後記

今回の編集後記は、前回の答えを解説しておきます。

話が見えない場合は、前回を読み返しておいてくださいね。

まぁ読み返さなくても、なんとなくわかってしまいますが…。

#!/usr/bin/perl

use strict;
print "Content-type: text/html\n\n";

my $line = 'P1e2r3l4/5C6G7I8';
my @chars = split(/[a-zA-Z\/]/, $line);
print @chars;
exit;

このPerl/CGIプログラムを実行すると「12345678」と表示されます。

文字列「P1e2r3l4/5C6G7I8」から…。

「Perl/CGI」を区切り文字として…。

「12345678」を取り出しました。

split関数部分は「my @chars = split(/[a-zA-Z\/]/, $line);」この中でも、区切り文字を指定している部分は…。

「[a-zA-Z\/]」ですね。

小文字のアルファベット「a-z」。

大文字のアルファベット「A-Z」。

それとスラッシュ「/」。

これらを前回解説しました方法で列挙しているだけです。

簡単ですよね。

もう少しスマートにしたければ…。

「my @chars = split(/[a-z\/]/i, $line);」このように書いてもOKですが…。

詳しい解説は、もう少し後のパターンマッチでしますので、お楽しみに。

ちなみに「my @chars = split(/[a-zA-Z]\//, $line);」と書いた場合は不正解ですよ。

大文字と小文字のアルファベット全体をくくり、最後に「/」を追加したくなる気持ちはわかりますが…。

それでは思うような結果は得られません。

では「[a-zA-Z\/]」と、「[a-zA-Z]\/」とではどう違うのかというと…。

「[a-zA-Z\/]」は、1文字完結型のパターンマッチです。

大文字または小文字のアルファベットか、「/」のどれか1文字があれば、それが区切り文字となります。

これに対して「[a-zA-Z]\/」は、2文字そろってはじめて完結するパターンマッチです。

1文字目が大文字または小文字のアルファベットのどれかで、2文字目には「/」を加えた状態を表現していることになるのです。

「[~]」から「/」を外に出したことにより、区切り文字は2文字であると判断されたわけです。

これがわかると「my @chars = split(/[a-z][A-Z]\//, $line);」この違いもわかりますよね。

「[a-z][A-Z]\/」ですから…。

1文字目は、小文字のアルファベット。

2文字目は、大文字のアルファベット。

3文字目は、「/」。

という3文字で構成される文字列が区切り文字として扱われるわけですね。

以上、微妙な違いですが、実行結果はぜんぜん違うパターンマッチの例でした。

小さなことですが、とても大切な部分ですから、よくわからない場合は復習しておいてくださいね。

今回の学習は以上です。

ありがとうございました。

<戻る>