perl - 実用的抽出および出力言語


Table of Contents

Perl とは、「Practical Extraction and Report Language」の略語で、 翻訳すると「実用的抽出および出力言語」でしょうか。 Perl は grepsed また awk のいいとこどりをしたような言語です。 Perlは、シェルにやらせるには荷が重く、Cで書く程大層なものでもないプログラムを書く際に便利な言語というかんじだったようですが、多くのモジュール(ライブラリ)も作られ、近年はもはや大層なものを作りまくれます。 インタープリタ言語ですが、文字列処理だけをやらせたら下手をすると自力で C 言語で書くよりも早いです。 CGI は一般的に perl で作成されることが多いので、学んでおくと役に立つでしょう。

ここでは小技しか説明しません。

sed 代わり Edit

% perl -pe 's/[regexp]/[replacement]/[flags]' < [filename] 

のように -p オプションを使用すると sed の ように処理させることが可能です。 while(<>){ … print;} のようなループ処理をします。 オプション -e はスクリプトを引数として書くときに使用するオプションです。

perl の文字列置換 s// の [flags] には以下のものが使用できます。

修飾子意味
i英字の大文字・小文字を無視する
xパターン内のスペースを無視し、コメントを入れられるようにする
g処理の対象範囲を全域とする
gc照合に失敗した場合に検索位置をリセットしない
sドット(.) が改行にも一致するようにする
m^ と $を照合するときに、埋め込まれている \n にも一致するようにする
oパターンを1回だけコンパイルする
e[replacement] を式とみなして実行する
ee[replacement] を文字列として評価し、式を実行してから、戻り値をもう一度評価する

awk 代わり Edit

% ypcat passwd | perl -ne '@a=split(/:/);print "$a[0] $a[4]\n";'

のように -n オプションを使用すると awk のように処理をさせることが可能です。 while(<>){ … } のような print なしのループ処理をします。

初期化、終了処理は awk のように BEGIN{}, END{} を使用できます。

% ypcat passwd | perl -ne 'BEGIN{@a=();}@a=split(/:/);print "$a[0] $a[4]\n";'

Edit

例えば

1:
2:
・・・
10:
11:

のような行番号がついているファイルの行番号部分を消すには

% perl -pe 's/^[^:]*://' < [filename] 

とすると簡単です。cat -n によってつけられた行番号は

% perl -pe 's/^.{7}//;' < [filename]

のようにするといいと思います。

他のオプションも sed と共通のものも多く、例えば、

% perl -pei 's/[regexp]/[string]/g' [filename]

とすれば、ファイル内文字列を置換して上書きしてくれます(-i は上書き修正オプション)。


xrea