入力で使うファイルは以下。これのtableにsummary属性を、thにabbr属性をつけることを考える。
$ cat test.html <p>test <table> <tr><th>and</th><th>0</th><th>1</th></tr> <tr><th>0</th><td>0</td><td>0</td></tr> <tr><th>1</th><td>0</td><td>1</td></tr> </table> </p>
以下のようなスクリプトを書いた。tableとthの開始タグの判定とそれぞれの置換処理を無名サブルーチンで定義した。コードリファレンスへの引数は$coderef->()のようにして与えればよい。マッチした内容の内>と<を除いたものを関数に渡している。変換後の文字列にサブルーチンを使う場合は/e修飾子が必要。
$ cat test.pl
#!/usr/bin/perl -w
use strict;
use warnings;
while (<STDIN>) {
s/<(.*?)>/
sub {
$a = shift;
if ($a eq 'table'){
$a = 'table summary=""';
} elsif($a eq 'th') {
$a = 'th abbr=""';
}
return "<$a>";
}->($1)
/ge;
print;
}
実行結果は以下
<p>test <table summary=""> <tr><th abbr="">and</th><th abbr="">0</th><th abbr="">1</th></tr> <tr><th abbr="">0</th><td>0</td><td>0</td></tr> <tr><th abbr="">1</th><td>0</td><td>1</td></tr> </table> </p>