ソースフィルタ

Perl 5.8.xは真偽値なら$x || $yって書けるんだけど、定義済み/未定義で判断するにはdefined $x ? $x : $yと書かないといけません。5.10.xでは同じ式を$x // $yと書けるようになる予定ですが。definedで書いてもいいんだけど、Perl 5.8.xでも//が使いたかったのでソースフィルタを使うことにしました。こういうことをしたいときに使うのが、Filter::Simpleです。で、軽く書いてみました。

package Tangerine::Core::Filter;

use strict;
use warnings;
use version; our $VERSION = qv('0.0.1');

use Filter::Simple;

FILTER {
    s{ \s+? (\S+?) \s*? // \s*? (\S+) \s}{ defined $1 ? $1 : $2 }x;
};

1;

これでこのモジュールが有効なスコープ内では//演算子が使えます。変なところに影響が出るといけないので、裸のブロックを使って有効なスコープを最小限に留めて使ってます。今回は使ってないけど、変に広いスコープで使って、s/ foo // ;なんてコードに引っかかったりしたら嫌だし。そういうチェックも書くべきだろうけど、面倒だし書きません。というか、これものすごくbuggyなので、安全のために[ $_, $priority{$_} // 10 ]みたいに後ろに空白文字を入れないと動かないようにしておきます。

このエントリ書いてから気づいたけど、Filter::Simpleの作者ってDamian Conwayなのね。

うわ、間違ってた。2回目の(\S+?)(\S+)の間違いです。あと少し保険も掛けて修正修正。