我有一个perl脚本(简化),如下所示:
my $dh = Stats::Datahandler->new(); ### homebrew module
my %url_map = (
'/(article|blog)/' => \$dh->articleDataHandler,
'/video/' => \$dh->nullDataHandler,
);
Run Code Online (Sandbox Code Playgroud)
本质上,我将循环%url_map,如果当前URL匹配一个键,我想调用该键的值指向的函数:
foreach my $key (keys %url_map) {
if ($url =~ m{$key}) {
$url_map{$key}($url, $visits, $idsite);
$mapped = 1;
last;
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到的消息是:
Can't use string ("/article/") as a subroutine ref while "strict refs" in use at ./test.pl line 236.
线236恰好是线$url_map{$key}($url, $visits, $idsite);.
我过去做过类似的事情,但我通常在没有函数参数的情况下这样做,并且没有使用模块.
虽然这是在这里回答,尽管是一个副本,我也可以发布正确的答案:
您需要做的是将代码引用存储为哈希值中的值.要获取方法的代码引用,可以使用UNIVERSAL::can所有对象的方法.但是,这还不够,因为该方法需要传递一个调用者.因此,最简单的方法是跳过->can并以这种方式编写它:
my %url_map = (
'/(article|blog)/' => sub {$dh->articleDataHandler(@_)},
'/video/' => sub {$dh->nullDataHandler(@_)},
);
Run Code Online (Sandbox Code Playgroud)
此技术将在散列中存储代码引用,当使用参数调用时,将依次使用这些参数调用适当的方法.
这个答案省略了一个重要的考虑因素,即确保caller在方法中正常工作.如果您需要,请查看我上面链接的问题: