Perl Hash of Subfunctions

时间:2011-02-04 01:54:19

标签: perl

我希望有一个包含对子函数的引用的哈希,我可以根据用户定义的变量调用这些函数,我将尝试给出一个我正在尝试做的简化示例。

my %colors = (
    vim => setup_vim(),
    emacs => setup_emacs(),
)

$colors{$editor}(arg1, arg2, arg3)

其中setup_vim()setup_emacs()将是我文件中稍后定义的子函数,$editor是用户定义的变量(即vim或emacs)。这可能吗?我无法使其发挥作用,或找到有关该主题的良好信息。感谢。

(注意我现在已经将它实现为一个工作的Switch,但我认为像上面这样的哈希会更容易在现有代码中添加新条目)

2 个答案:

答案 0 :(得分:17)

这是语法。

my %colors = (
    vim => \&setup_vim,
    emacs => \&setup_emacs,
);

$colors{$editor}(@args)

请注意,您实际上可以使用

直接创建函数
my %colors = (
    vim => sub {...},
    emacs => sub {...},
);

如果你熟悉闭包,Perl支持对词法声明的变量进行完全闭包,你可以用它做。

答案 1 :(得分:3)

您必须将对要调用的子例程的引用传递给哈希。

以下是一个例子:

sub myFunc {
   print join(' - ', @_);
}

my %hash = ( key => \&myFunc );
$hash{key}->(1,2,3);

使用\& myFunc,您可以获得该功能的参考点。重要的是离开()。哦,你会通过对函数返回值的引用。

通过引用调用函数时,必须使用 - >来解除它。操作