创建子例程的哈希,并运行一个

Orj*_*anp 1 perl

我正在尝试复制示例中给出的解决方案.

代码如下:

use strict;
use warnings;

my %hash = (
  one => sub { print 'one'; },
  two => sub { print 'two'; },
);

$hash{one};
Run Code Online (Sandbox Code Playgroud)

我在运行时遇到的错误是:

在t.pl第9行的void上下文中无用的hash元素.

我在这里做了一个运行的例子.

我哪里错了?

Sob*_*que 5

当它不是sub中定义的符号时,你需要告诉perl它是一个显式的代码引用,让它"运行"它 - 否则你刚刚获得了一个匿名哈希的代码引用,你试图使用它在无效的背景下.

你可以这样做:

$hash{one}->();
Run Code Online (Sandbox Code Playgroud)

要么:

&{$hash{one}}();
Run Code Online (Sandbox Code Playgroud)

要么:

$hash{one}();
Run Code Online (Sandbox Code Playgroud)

  • `&{...}`表单有效但应该避免,因为它转发当前参数 - 类似于`$ hash {one}(@_)`.显式函数调用更好. (5认同)
  • Re"*类似于`$ hash {one}(@_)`*",但更危险,因为在被调用子中对`@ _`的更改也会影响调用子中的`@ _`. (2认同)