2017-02-04 134 views
1

调用方法我有方法的哈希表:perl的 - 从哈希

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

我认为你必须通过'$ self'是的。也就是说,如果你是从同一个类中的另一个方法调用方法。通常当你调用方法的时候,你会得到一个祝福的对象引用(使用语法'$ obj-> method(...)'),然后你不需要传递'$ self'。 –

+0

你需要显示调用方法。 '$ macroName'和'$ ws1'从哪里来? – Borodin

+0

'$ macroName'和'$ ws1'是解析输入文件的结果。在这种情况下,'$ macroName'将是'strip','$ ws1'是'strip'后面的空白。 (好吧,从技术上说,在一个makefile中,'strip'是一个函数而不是宏,但我试图保持与程序中的C对应的命名一致)。 – user2766918

回答

2

您也可以调用对象的代码ref。这样,左边的东西就会被传入。

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作为任意类/对象的例子。

+0

虽然这可能不适用于哈希。我不在电脑附近,所以我现在不能确认。 – simbabque

+0

好的,谢谢。我更新了我的代码,以这种方式做事。我很欣赏这些评论。 – user2766918