イメージ的には、rlibの下に適当な.pmファイルをおいておけば、それぞれの.pm内部に書かれた正規表現にマッチしているモジュールを使うような。例えばanimate.tvとlantis-netで別々のクローラーを使いたいけど、メインのスクリプトをいじらずモジュールをフォルダーに入れるだけで使えるようにしたい的な。
use strict; use warnings; our %func_table; my $url = shift or die; require 'rlib/A.pm'; foreach my $k (keys %func_table){ print "$k $func_table{$k}\n"; if($url =~ /$func_table{$k}/){ my $obj = $k->new; $obj->parse; } }
# rlib/A.pm use strict; use warnings; use Data::Dumper; package rlib::A; BEGIN{ $main::func_table{+ __PACKAGE__ } = qr/animate.tv/; } sub new{ my $class = shift; $class = ref $class || $class; return bless({}, $class); } sub parse{ print "dummy\n"; } 1;
$ perl a.pl 'http://www.animate.tv/radio/details.php?id=hibichika' rlib::A (?-xism:animate.tv) dummy
もうちょっとスマートなやり方がありそうな気がする。が、とりあえず欲しい機能は実装できそう。