北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

コロンブスのタマゴ

一瞬実装がわからなかった。


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';