綾小路龍之介の素人思考

[perl] perl - 置換演算子の置換文字列に引数込みの無名関数の戻り値を使う

込み入った置換を行いたい場合は変換後文字列にサブルーチンを使うと良い。この場合、s///eのように/e修飾子をつけて式の右側の評価を行う。

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

リファレンス

  1. perlsub - Perl のサブルーチン 【perldoc.jp】
  2. perlop - Perl の演算子と優先順位 【perldoc.jp】
  3. 関数の結果で置換する

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2010-02-25T08:56:12+09:00
  2. Modified: 2010-02-25T08:56:12+09:00
  3. Generated: 2017-04-10T23:09:26+09:00