入力で使うファイルは以下。これの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>