実録コンピュータ物語

趣味で使っているコンピュータ&アプリの情報を発信するブログです。

[Perl6]HTMLエスケープはtransメソッドを使おう

HTMLやXMLの処理でよくある特殊文字& < > ' "」のエスケープをPerl 6でやってみましょう。

Perl 6の文字列には.transという便利なメソッドがあります。これは変換前→変換後のペアを受け取って文字の変換を行ってくれます。

my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) =>
        ( '&amp;', '&lt;', '&gt;', '&quot;', '&apos;' );

sub encode-entities(Str $str) {
    return $str.trans($trans-pair);
}

my $encoded = encode-entities( q[a & b < c > d " e '] );
say $encoded;
# 出力:a &amp; b &lt; c &gt; d &quot; e &apos;

エスケープ済みの文字列を復元するのは簡単で、.transメソッドに渡すペアを逆にするだけです。ペアを逆にするには.antipairメソッドを使います。

my $trans-pair = ( '&', '<', '>', q{"}, q{'} ) =>
        ( '&amp;', '&lt;', '&gt;', '&quot;', '&apos;' );

sub encode-entities(Str $str) {
    return $str.trans($trans-pair);
}

sub decode-entities(Str $str) {
    return $str.trans($trans-pair.antipair); # ペアを逆にして渡す
}

my $decoded = decode-entities( q[a &amp; b &lt; c &gt; d &quot; e &apos;] );
say $decoded;
# 出力:a & b < c > d " e '