perl - 来自hash的call方法

时间:2017-02-04 14:12:13

标签: perl hash hashtable

我有一个方法哈希表:

my %makefileMacroSimplifiers = (
    "or" =>         \&makefileSimplifyOr,
    "and" =>        \&makefileSimplifyAnd,
    "strip" =>      \&makefileSimplifyStrip,
);

sub makefileSimplifyStrip {
    my $self = shift;
    my $prefix = shift;
    my $paramsRef = shift;
...
}

每个方法都需要$self。我所拥有的是:

$makefileMacroSimplifiers{$macroName}->($self, $macroName.$ws1, \@parms);

这似乎有效,但我明确地将$self传递给方法似乎有点奇怪。有没有更好的方法,或者这被认为是正常的编码实践? (我没有找到更好的方法在网上做到这一点,但我想如果我没有使用正确的搜索条件,我会问。)

1 个答案:

答案 0 :(得分:2)

您还可以在对象上调用代码引用。那样左边的东西就会传入。

my $coderef = sub { ... };
$self->$coderef(@args);

使用哈希元素不会像这样工作。

 $self->$dispatch{foo}(1, 2, 3); # BOOM

这是语法错误。所以你需要先获取代码参考。 Borodin also explains this above in their comment

my %dispatch = (
    foo => sub { print "@_" },
);

require HTTP::Request;
my $obj = HTTP::Request->new;
my $method = $dispatch{foo};
$obj->$method(1, 2, 3);

我在这里使用HTTP :: Request作为任意类/对象的一个​​例子。