Diff of UNIX/コマンド/テキスト処理/perl


TITLE:perl - 実用的抽出および出力言語
#navi(UNIX/コマンド)
#contentsx

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

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

* sed 代わり [#n0545f63]
 % perl -pe 's/[regexp]/[replacement]/[flags]' < [filename] 
のように -p オプションを使用すると sed の ように処理させることが可能です。
while(<>){ … print;} のようなループ処理をします。
オプション -e はスクリプトを引数として書くときに使用するオプションです。

perl の文字列置換 s// の [flags] には以下のものが使用できます。
|修飾子|  	意味|h
|i 	|英字の大文字・小文字を無視する|
|x 	|パターン内のスペースを無視し、コメントを入れられるようにする|
|g 	|処理の対象範囲を全域とする|
|gc 	|照合に失敗した場合に検索位置をリセットしない|
|s 	|ドット(.) が改行にも一致するようにする|
|m 	|^ と $を照合するときに、埋め込まれている \n にも一致するようにする|
|o 	|パターンを1回だけコンパイルする|
|e  	|[replacement] を式とみなして実行する|
|ee  	|[replacement] を文字列として評価し、式を実行してから、戻り値をもう一度評価する|
* awk 代わり [#d63b858b]
 % 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";'
* 例 [#a59e5408]
例えば
 1:
 2:
 ・・・
 10:
 11:
のような行番号がついているファイルの行番号部分を消すには
 % perl -pe 's/^[^:]*://' < [filename] 
とすると簡単です。cat -n によってつけられた行番号は
 % perl -pe 's/^.{7}//;' < [filename]
のようにするといいと思います。

他のオプションも [[sed]] と共通のものも多く、例えば、
 % perl -pei 's/[regexp]/[string]/g' [filename]
とすれば、ファイル内文字列を置換して上書きしてくれます(-i は上書き修正オプション)。

#navi(UNIX/コマンド,,footer)
xrea