10. Perl で正規表現(2)〜文法
10−1 Perl の文法
10−2 定数・変数 10−3 構文 10−4 条件式・パターンマッチ 10−5 ファイルハンドル 10−6 特殊なファイルハンドル 10−7 特殊な変数 10−8 1行スクリプトとオプション 10−1 Perl の文法本来それだけで一冊の、いや何冊もの本が書けてしまいますから、詳しくは書籍・ 解説サイト等をあたってください。大雑把にいうと、文法自体は、C言語、Java、JavaScript などに似ています。 BASIC・VB系(VB、VBA、 VBScript)しか知らない人は、馴れるまでちょっとかかるかもしれません。 以下に、テキストファイルを読み込み、正規表現を利用して文字列の検索・置換を行なう作業に 深く関わる部分だけ取り上げて紹介します。 10−2 定数・変数スクリプト中で文字列を記述する場合は 'abc' または "abc" という形で書きます。 数値を記述する場合は、クォートで囲む必要はありません。数値・文字列を変数に格納して参照したり計算したりできます。変数名の先頭には $ を付けます。
変数に"型"はありません(ですから当然、型宣言もありません)。 数値でも文字列でも受け付けます。 というより、数字をクォートで囲んで文字列として格納しても、その値を使って数値計算ができますし、 逆に、数値が入った変数同士を文字列連結の演算子 . で結びつけることもできます。 要するにナンデモアリです。
(1行スクリプトについては、後述の第8節を参照して下さい。)
10−3 構文Perl の文は ; で区切られます。1行に複数の文を記述することもできます。
10−4 条件式・パターンマッチ条件式とは、分岐や繰り返しで判断材料に使われる式で、真(TRUE)/偽(FALSE) いずれかに評価されます。条件式には以下のような形があります。 (1) 定数はその値自体、代入式は左辺の値が判定値となります。 その場合、0以外が真、0が偽と見なされます。
eof(FH1); … FH1 がすでにファイル終端であれば真。 (4) パターンマッチ。 ここに、本ページの主題である正規表現がからみます。
10−5 ファイルハンドルディスク上にあるテキストファイルを Perl の世界に引きずり込むには、ファイルを開いて「ファイルハンドル」 というものを割り当てます。背番号のようなものです。これを通じてファイルの中身を取り出したり、 ファイルの中へ文字列を書き込んだりします。ファイルハンドルは、いわゆる変数とは違うものなので $ は付けません。慣習として、大文字で記します。
以下のスクリプトは、非常によく使われる構文です。ファイルから1行ずつ 読み取って所定の処理を繰り返し、ファイルの終端に達した時点で (条件式としては偽となって)処理を終了します。
10−6 特殊なファイルハンドルコマンドラインで処理対象に指定されたファイルのファイルハンドルは ARGV と決まっていて、あらかじめ宣言する必要なくいつでも使えます。フィルタ処理で流れ込んでくるデータの取り込み口は「標準入力」です (デフォルトの入力はキーボードからですが、入力のリダイレクトやパイプによって、 何らかのデータが流れ込んできていることが多いと思います)。 標準入力のファイルハンドルは STDIN と決まっていて、 事前に宣言する必要なくいつでも使えます。 また、コマンドラインで処理対象ファイルが明示されていない場合、ARGV は STDIN と一致します。 出力先ファイルを明示しない時に出力対象となる出口は、「標準出力」です。 (デフォルトの出力先は画面表示ですが、出力のリダイレクトやパイプによって、 ファイルや他のコマンドへ流し込むも多いと思います)。 標準出力のファイルハンドルは STDOUT と決まっていて、 事前に宣言する必要なくいつでも使えます。
10−7 特殊な変数Perl にはいくつもの特殊変数が決められていますが、そのうち $_ だけはどうしても 解説を省略することができない重要な変数です。$_ は、「他の変数が明示されていなければ、暗黙のうちに対象とされている」変数です。 具体的には、以下の場合にデフォルトの変数とみなされます。 (1) while文中におけるファイルハンドルからの読み込み。 (2) パターンマッチ・文字列置換の左辺。 (3) print文の出力内容、その他多くの関数の引数のデフォルトになる。 下の二つのスクリプトは同義です。
10−8 1行スクリプトとオプションテキストファイルに保存したスクリプトを指定するのでなく、 コマンドラインに1行スクリプトを書いて済ませる方法を紹介します。1行スクリプトは、perl -e "スクリプト" [処理ファイル] という形で指定します。1行とはいえ、 ; で区切って複数の命令を記述することが可能です。
perl -pe "スクリプト" 処理ファイル という形にすると、 スクリプト が
perl -ie "スクリプト" 処理ファイル という形にすると、加工した結果を処理対象ファイルに書き戻します。もちろん、 perl -ine "スクリプト" 処理ファイル perl -ipe "スクリプト" 処理ファイル という組み合わせも可能です。 便利(特に処理ファイルが複数の時)ですが、実行後、元のデータは失われますので注意が必要です。 元のファイルを残したい場合は、 perl -i.bak -e "スクリプト" 処理ファイル のように、任意の拡張子を付けて残すこともできます。 |