一瞬実装がわからなかった。
Perl6::Jenction は、Perl5でジャンクションを使うためのモジュールです。
use Perl6::Junction qw/any/; my $str = 'hage'; print "found.\n" if $str eq any 'hoge', 'foo', 'hage';
ドキュメント読んでみて、やっと、簡単に実装できることに気がつきました。ソース見たらやっぱその通り。実装の想像がつかない人はソース読んでみましょう。簡単過ぎてびびります。
実装の概要は以下。
package Any; # 演算子のオーバロード(これがキモ) use overload 'eq' => \&str_eq; # any呼ぶとオブジェクトが返る BEGIN{ *main::any = sub(@) {new Any(@_)}; } # 引き数をblessしてオブジェクト化 sub new{ bless \@_, shift} # 配列に対するeqを行う sub str_eq{ my $self = shift; my $opr = shift; foreach(@$self){ return 1 if($_ eq $opr); } return 0; } #メインルーチン package main; my $str = 'hage'; print "found.\n" if $str eq any 'hoge', 'foo', 'hage';