perl的 - 从哈希
调用方法我有方法的哈希表: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
明确地传递给方法。有没有更好的方法来做到这一点,或者这是否被认为是一种正常的编码习惯? (我没有找到更好的方法在网络上做到这一点,但我想我会问,如果我没有使用正确的搜索条件)。
您也可以调用对象的代码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作为任意类/对象的例子。
虽然这可能不适用于哈希。我不在电脑附近,所以我现在不能确认。 – simbabque
好的,谢谢。我更新了我的代码,以这种方式做事。我很欣赏这些评论。 – user2766918
我认为你必须通过'$ self'是的。也就是说,如果你是从同一个类中的另一个方法调用方法。通常当你调用方法的时候,你会得到一个祝福的对象引用(使用语法'$ obj-> method(...)'),然后你不需要传递'$ self'。 –
你需要显示调用方法。 '$ macroName'和'$ ws1'从哪里来? – Borodin
'$ macroName'和'$ ws1'是解析输入文件的结果。在这种情况下,'$ macroName'将是'strip','$ ws1'是'strip'后面的空白。 (好吧,从技术上说,在一个makefile中,'strip'是一个函数而不是宏,但我试图保持与程序中的C对应的命名一致)。 – user2766918