在Perl中使用变量作为方法名称

Gle*_*rry 3 perl perl-module

我有一个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);.

我过去做过类似的事情,但我通常在没有函数参数的情况下这样做,并且没有使用模块.

Eri*_*rom 5

虽然这是在这里回答,尽管是一个副本,我也可以发布正确的答案:

您需要做的是将代码引用存储为哈希值中的值.要获取方法的代码引用,可以使用UNIVERSAL::can所有对象的方法.但是,这还不够,因为该方法需要传递一个调用者.因此,最简单的方法是跳过->can并以这种方式编写它:

my %url_map = (
    '/(article|blog)/' => sub {$dh->articleDataHandler(@_)},
    '/video/'          => sub {$dh->nullDataHandler(@_)},
); 
Run Code Online (Sandbox Code Playgroud)

此技术将在散列中存储代码引用,当使用参数调用时,将依次使用这些参数调用适当的方法.

这个答案省略了一个重要的考虑因素,即确保caller在方法中正常工作.如果您需要,请查看我上面链接的问题:

如何对构造函数进行代码引用?