last-modified: 2nd/June/'01;
since: 1st/June/2001;
前節では、出力を、モニタではなくファイルにする方法を紹介しました。本節では、入力を、キーボードからではなくファイルからにする方法を紹介します。
ここでは、ファイルから文字列を検索するプログラムを作成しましょう。
次のスクリプトは、ファイル名と文字列をキーボードから入力すると、指定されたファイルから入力された文字列を含む行を抜き出して、モニタに表示します。
output.pl>>
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: |
#!/usr/bin/perl #上の行では、 Perl のパスを記述してください。 print "File Name; "; chomp($filename = <STDIN>); open(IN, $filename) || die "$filename: $!"; print "Pattern?; "; chomp($pattern = <STDIN>); while(<IN>){ if (/$pattern/) { print "line $.> $_"; } } close(IN); |
5 行目で入力ファイルをハンドル IN に結び付けて、 13 行目にこの結合を切って、ファイルを閉じています。
[説明]
次に、シェルプロンプトからの実行例を示します。
シェル>>
1: 2: 3: 4: 5: 6: 7: |
% chmod +x input.pl % ./input.pl File Name; ActivePerl-faq1.html Pattern?; [Pp]erl line 61> <p>Perl is a scripting language widely used for system administration and line 65> <p>perl (small 'p') is the program used to interpret the Perl language.</p> % |
1 行目でファイルに実行許可を与えて、 2 行目で実行しています。
3 行目で検索するファイル名を与えて、 4 行目で検索対象のパターンを与えています。
5 行目から 6 行目が出力結果です。実際は大量にヒットしたのですが、ここでは分かりやすい二行だけを出力例として挙げました。
ファイルから行を入力できる限り繰り返しますが、全て読み上げ終わると繰り返し条件式が偽を返すためにプログラムが終了します。
5 行目で入力したパターンは Perl のキモとも云える正規表現です。単に perl と入力すると、小文字の p にしか一致しません。そこで [Pp]erl と記述すると、 Perl または perl に一致します。
正規表現では他にも沢山の特殊な記法が存在します。
[Pp]eal[ ]」内の文字列のいずれかひとつに一致します。従って、 Perl か perl に一致ます。Pe.l.」は任意の一文字を表します。したがって、 Perl, Peal などに一致します。^Perl^」は後続のパターンが行の先頭であることを意味します。行の最初の単語が Perl である場合に一致することになります。Perl$$」は直前のパターンが行の最後であることを意味します。行の最後の単語が Perl である場合に一致します。P.*l*」は直前の文字のゼロ回以上任意の回数の繰り返しを意味します。直前の文字が任意「.」ですから、 Perl, Pl, Pearl などに一致します。\」 は後続の特殊文字の意味を奪って単なる文字にするエスケープです。従って、 * (アステリスク)に一致します。正規表現は、文字列のパターンを表現するものです。このパターンに一致することを、マッチすると云い、このような文字列検索はパターンマッチと呼ばれます。
Perl スクリプトでは、正規表現は /pattern/ のように登場します。スラッシュ( / )で括られた内部が正規表現と解釈されます。
因みに、正規表現で日本語を利用するためには、日本語化パッチ jperl, MacJPerl を利用する必要があります。
Perl では他にも沢山の便利な正規表現が利用できます。これが Perl の特長にもなっていますので、利用してみてください。次節で Perl の正規表現をまとめて紹介しています。
変数に代入された文字列に、パターンが存在するかどうかを判定するための演算子は =~ が使われます。
$a =~ /hogehoge/
具体的には次のように使います;
| 「perl」 と云う表現があるかどうか; | $a =~ /perl/
|
| 数字が含まれているかどうか; | $a =~ /[0-9]/ |
| 「~時~分」という表現があるかどうか; | $a =~ /時.*分/ |
| 大文字から始まっているかどうか; | $a =~ /^[A-Z]/ |
| 「;」で終わっているかどうか; | $a =~ /;$/ |