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

前端之家收集整理的这篇文章主要介绍了在Perl中使用变量作为方法名称前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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(@_)},);

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

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

How to take code reference to constructor?

猜你在找的Perl相关文章