Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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みたいな方がいい気がするんだけど。