【问题标题】:Perl: Problems calling subroutines by reference using a hash valuePerl:使用哈希值通过引用调用子例程的问题
【发布时间】:2012-06-22 20:47:32
【问题描述】:


在 Perl 中,您可以像这样通过引用(或名称)调用函数:

    my $functionName = 'someFunction';
    &$functionName();

    #someFunction defined here:
    sub someFunction { print "Hello World!"; }

我想做的是使用哈希值,如下所示:

    my %hash = (
        functionName => 'someFunction',
    );

    &$hash{functionName}();

    #someFunction defined here:
    sub someFunction { print "Hello World!"; }

我得到的错误是全局符号“$hash”需要明确的包名。

我的问题是:有没有不使用中间变量的正确方法?
对此的任何帮助将不胜感激!

【问题讨论】:

  • 你也可以使用my %hash = ( function => \&someFunction ),不需要no strict 'refs'
  • @TLP +1,我打算回答这个。 use strict; 省去了所以很多麻烦...
  • 我可以使用它,但它添加了一些有点不可读的代码(目前)......我在运行时动态设置 functionName 的值并通过其名称调用函数。 Perl 太有趣了!

标签: perl hash reference subroutine callbyname


【解决方案1】:

这只是一个优先级问题,可以通过不省略花括号来解决。你可以使用

&{ $hash{functionName} }()

或者使用替代语法:

$hash{functionName}->()

在索引之间,-> 可以省略(但我这里没有省略):

$hash{functionName}()

参考:Deferencing Syntax

【讨论】:

  • 哇,这是我在这里问过的第一个问题,期待漫长的等待。太感谢了!我最终使用了您发布的第一个解决方案。好东西!非常感谢。
  • 另外,我忘了说我对 Perl 还很陌生(可能只有一个月的经验),所以这对我的职业发展很有帮助。
  • 我有点惊讶,因为大多数人认为箭头符号最易读,但两者都可以接受。
  • 我的推理是因为某处(不记得在哪里)我读到,在按名称调用函数时,如果没有与号,则无法传入参数。我将参数传递给其他函数,所以我想保持一致。
  • 这根本不是真的。 $ref->(@args) 工作完美。不过,&$ref(但不是&$ref())非常特别。它重用了父级的@_,这是您通常想要避免的。使用->() 的另一个原因。 :)
猜你喜欢
  • 2012-04-25
  • 2013-02-06
  • 2011-10-22
  • 2018-04-06
  • 2017-03-13
  • 2017-07-18
  • 2023-03-13
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多