サンプル1 ソースコード中の文字列を置換する

リスト1●簡単な英文を表示するプログラム。このプログラム中の配列変数@fruits を置換するにはどうしたらいいだろうか
リスト2●リスト1 中の配列変数を置換するプログラム
図4●Perlでは簡単な1行プログラムならコマンドプロンプトから実行できる。これをワンライナーと呼ぶ
リスト3●四つの雑誌名に合致する正規表現を作り出すプログラム
図5●リスト3の実行結果。慣れていない人にはとても書けない正規表現を一瞬で出力する

 前置きが長くなりました。さっそくサンプル・プログラムを紹介しましょう。

 Perlの得意分野と言えばなんといっても文字列処理です。ここではスクリプトのソースコードを例にとって,変数名を一括置換するプログラムを紹介します。リスト1[拡大表示]が置換対象のプログラムです。このプログラムで使っている配列変数*5「@fruits」を「@citrus」に変更してみましょう。単純に「fruits」という文字列を「citrus」に置換すると,print文の冒頭文字列部分まで変わってしまいます。かといって,「@fruits」を「@citrus」に置換してしまうと,今度は配列変数の要素である「$fruits[0]」がそのままになってしまいます。

 このような条件に対応するには,正規表現を使います。今回は変数名の先頭に「@」か「$」があることを表現します。このように複数の文字を指定するには「[」と「]」でくくります。つまり,「[$@]fruits」と書けば,@fruitsと$fruitsを表現したことになります。

 さらに,置換後に「@」や「$」の部分を維持させなければなりません。その場合「(」と「)」でくくります。これらを利用してスクリプトを作るとリスト2[拡大表示]のようになります。

 「while(<>)」の部分は,標準入力*6から読み込んでループする命令です。非常に良く使う基本形なので,ぜひ覚えておきましょう。置換には「s///」という構文を使います。リスト2では最後に「g」が付いています。これはオプションで,条件に合致した文字列が1行の中に複数ある場合には,すべてを置換対象にするという意味です。正規表現の先頭が「\$@」となっていることに気付いた方もいらっしゃるかもしれません。Perlでは「$」はスカラ変数を表す特殊な文字です。そこで,普通の文字として「$」を表現したいときは「\$」と表記するのです。

 このプログラムを実行するには,コマンドプロンプトのリダイレクト*7を使います。例えば,書き換え実行プログラムの名前を「rewrite.pl」,書き換え対象のプログラムの名前を「rewrite_target.pl」とした場合,コマンドプロンプトには「perl rewrite.pl < rewrite_target.pl」と入力してください。実行するプログラムを指定した後で,「<」を挟んで書き換え対象のプログラムを指定します。

 実行すると,コマンドプロンプトの画面に結果が出てきます。狙った部分だけが書き換えられていることがわかると思います。結果をファイルに書き出したいときは,「>」を使って出力をリダイレクトしましょう。例えば「perl rewrite.pl < rewrite_target.pl > result.pl」と打ち込んで実行すれば,書き換え結果を「result.pl」というファイルに出力できます。

 ところで,リスト2のような単純なプログラムなら,ソース・ファイルを作成するまでもなく,コマンドラインに直接Perlのコマンドを記述して実行できます。例えば,リスト2と同じ処理は,図4[拡大表示]のように1行のコマンドライン入力で実行できます。このような1行コードをワンライナーと呼びます。

サンプル2 思い通りの正規表現を作成する

 正規表現は使い慣れるととても便利ですが,習得は簡単ではありません。最初のうちはなかなか思い通りの正規表現を書けません。そこで役に立つのがPerlの「Regexp::Assemble」モジュールです。このモジュールに複数の文字列を指定すると,それらすべてにマッチする正規表現を作ってくれます。

 なお,Regexp::AssembleはPerlの標準モジュールではないので,別途インストールする必要があります。モジュールのインストールについてはカコミ記事「PPMで拡張モジュールをインストール」を参照してください。

 今回は「日経ソフトウエア」「日経WinPC」「日経ソリューションビジネス」「日経Windowsプロ」にマッチする正規表現を作ってみましょう。Regexp::Assembleを使ってプログラムを組むとリスト3[拡大表示]のようになります。

 単純に考えると,「(日経ソフトウエア|日経WinPC|日経ソリューションビジネス|日経Windowsプロ)」とすべての単語を並べてしまっても正しい正規表現にはなりますが,同じ文字列を繰り返しているので最適とは言えません。リスト3を実行すると,結果は図5[拡大表示]のようになります。皆さんの予想と同じなったでしょうか。