YadaYada
「やだやだ演算子」が、Perl5.12.0から実装されている。
というのを、さっき perl5120delta を見ていて知った。
...; # ←これ
それにしても、英語でも「Yada Yada Operator」って、すごいネーミング…。
詳細は perlop 。
http://perldoc.perl.org/perlop.html#Yada-Yada-Operator
これに沿って書いて見る。
なんでも、未実装なサブルーチンのプレースホルダとなる演算子らしい。
コードのパースはエラーにならないけれど、ランタイムにエラーになる、とのこと。
要するに eval でキャッチできるタイプのエラーで死ぬ。
sub unimp { ... } unimp(); print "ok\n";
Unimplemented at - line 2.
「Unimplemented」(実行できませんでした)というメッセージを残して死ぬ。
ゆえに、きっちりキャッチするなら、
sub unimp { ... } eval { unimp(); }; if ($@ eq 'Unimplemented') { print "まだ作っていません。あしからず"; }
「$@」に入るのでそこを狙う、と。
しかしというか、やはりというか、このやだやだくん、昔からの範囲演算子である「...」と全く同じなため、完全な statement でしか機能しない。
あと式評価にも使えない。
{ ... } # ok sub foo { ... } # ok ...; # ok print ...; # ng if( $condition && ... ) {} # ng
もうひとつ注意事項。
式評価か statement かPerl自身分からないとき、たとえばブロックなのか無名ハッシュなのか分からないときは、Perlが"{...}"をブロックと思わなければ syntax error になる。
ブロックだと分からせれば、syntax error にならない。
つまり、上記の場合は、「;」があればブロックになるので、やだやだできる。
my @transformed = map { ... } @input; # syntax error my @transformed = map {; ... } @input; # yada yada
というか、ほんとにこれ使える機能なのかな...?
普通にテストのskipみたいな方がいい気がするんだけど。