HTMLタグのエスケープは文字クラスとhashでやる

404 Blog Not Found:perl - 勝手に添削 - 40行で作るPerl用テンプレートエンジン

2つ勉強になった。HTMLタグのエスケープとreturn

例えば、これを以下のように書いてしまった場合、どうなるだろうか。

sub convert {
    return unless defined(my $str = shift);
    $str =~ s{<}{&lt;}gso;
    $str =~ s{>}{&gt;}gso;
    $str =~ s{\"}{&quot;}gso;
    $str =~ s{&}{&amp;}gso;
    $str;
}

この場合、先に>となったものが、&gt;となるリスクが避けられない。

こういう場合は、文字クラスとhashのコンボで攻めるのが正しい。

my %escaped = ( '&' => 'amp', '<' => 'lt', '>' => 'gt', '"' => 'quot' );
sub escape {
    my $str = shift or return;
    $str =~ s{([&<>"])(?!amp;)}{'&' . $escaped{$1} . ';'}msxgeo;
    $str;
}

これは前者でやってた。気を付けよう。
あと、関数で「or return」って書き方ができるのね。

これも勉強になった。