[時間割:Perl]『ミニマルPerl』その8
2008/11/05 02:49 posted by kunkichi
昨日は祝日で外に遊びにいってたのですが、一応ノルマは守りました。ということで月曜日の『Perl』の勉強成果をアップ。引き続き、sedをPerlで置き換えてみます。
ミニマルPerl Unix/LinuxユーザのためのPerl習得法
posted with amazlet at 08.10.06
Tim Maher
オライリージャパン
売り上げランキング: 96883
オライリージャパン
売り上げランキング: 96883
- テンプレート的に使う。以下のようなメールの雛形ファイルがあるとして、
From: %%FROM%%<%%ADDR%%>これを置き換えるスクリプトをmake_mail.plとする。内容は以下
To: %%TO%%
Subject: [%%LEVEL%%] %%SUBJECT%%
%%CONTENTS%%
------------------------------
This mail is automatically sent.#!/usr/bin/perl -s -wplで実行するコマンドは以下。
s/ %%FROM%% /$from/xg;
s/ %%ADDR%% /$addr/xg;
s/ %%TO%% /$to/xg;
s/ %%LEVEL%% /$level/xg;
s/ %%SUBJECT%% /$subject/xg;
s/ %%CONTENTS%% /$contents/xg;$ ./make_mail.pl -from='kunkichi' -addr='kunkichi@example.com' -to='admin@example.com' -level='CRITICAL' -subject='SERVER DOWN!!!' -contents='Server is down at 10:25. Please Check!!!' mail.tpl出力結果:From: kunkichi <kunkichi@example.com>-sで引数を変数として取る。正規表現でxを使って正規表現中にスペースを含めるので、読みやすい。ただし、変換前文字だけ。
To: admin@example.com
Subject: [CRITICAL] SERVER DOWN!!!
Server is down at 10:25. Please Check!!!
------------------------------
This mail is automatically sent. - 特殊文字のマッチングを使って変換もできる。8進数→ASCII文字とか、\c制御文字とか。
- -iを使って、編集元のファイルを直接変換&バックアップ。
$ perl -i.BAK -wpl -e 's/aaa/bbb/g;' sample.txtオリジナルファイルは、sample.txt.BAKとしてリネームされて、sample.txtに変換後の結果が上書きされる - -iを使う場合は、-p、もしくは-n&printを使わないと、ファイルに何も出力されない、空ファイルができるので、注意!
- スクリプト化しても便利。
#!/usr/bin/perl -s -i.BAK -wpl-sでオプションを取ってオリジナルファイルを変換、元ファイルは.BAKをつけてリネーム。
s/$re/$after/g; - 正規表現でx修飾子を使うと、スペースだけじゃなくてコメントも入れれる。
s/
^ # 行頭が
aaa # aaaで始まり
.* # 任意の文字が0回以上続いて
bbb # bbbで
$ # 行末が終わる
/changed/gx; # ところを"changed"に置き換える。 - -iを使ってバックアップをとっても、同じことを2回実行すると、結局元々のオリジナルは失われてしまう(バックアップがバックアップで上書きされる)。こういう場合は、-iの拡張子に毎回異なるもの、例えばシェル変数で時間とか、を指定すれば何回実行してもOK。例えば$SECONDSで、シェル起動後の秒数とか。
$ perl -i.$SECONDS -wpl -e 's/aaa/bbb/g;' sample.txt - -iで拡張子を指定する代わりに、-iを単体で使って、$^Iという拡張子を示す特殊変数に拡張子を指定することもできる。例えばPIDとか。
#!/usr/bin/perl -i -wplただしこれはコマンドラインからの実行では、$$はシェルで展開されてシェルのPIDが入ってくるので、同じシェルで2回実行すると全く意味が無くなる。あくまでもスクリプト内で使う。
BEGIN{ $^I=$$; }
s/aaa/bbb/g;
sedのところは残り少しです。








コメント&トラックバック
トラックバックURL: