我有一个perl脚本(简化),如下所示:
my $dh = Stats::Datahandler->new(); ### homebrew module my %url_map = ( '/(article|blog)/' => \$dh->articleDataHandler,'/video/' => \$dh->nullDataHandler,);
本质上,我将循环遍历%url_map,如果当前URL匹配一个键,我想调用该键值指向的函数:
foreach my $key (keys %url_map) { if ($url =~ m{$key}) { $url_map{$key}($url,$visits,$idsite); $mapped = 1; last; } }
但我收到的消息是:
在./test.pl第236行使用“strict refs”时,不能使用字符串(“/ article /”)作为子程序ref.
第236行恰好是$url_map {$key}行($url,$idsite);.
我过去做过类似的事情,但我通常在没有函数参数的情况下这样做,并且没有使用模块.
解决方法
虽然这是在这里回答,尽管是一个副本,我也可以发布正确的答案:
您需要做的是将代码引用存储为哈希值中的值.要获取方法的代码引用,可以使用所有对象的UNIVERSAL :: can方法.但是,这还不够,因为该方法需要传递一个调用者.因此,最明显的是跳过 – > can并且可以这样写:
my %url_map = ( '/(article|blog)/' => sub {$dh->articleDataHandler(@_)},'/video/' => sub {$dh->nullDataHandler(@_)},);
此技术将在散列中存储代码引用,当使用参数调用时,将依次使用这些参数调用适当的方法.