6
$ cat test.pl
use strict;
use warnings;

sub route {
    print "hello, world!";
}

my %h;
$h{'a'} = 'route';

print "1\n";
$h{a};

print "2\n";
$h{a}();

print "3\n";
"$h{a}".();
$ perl test.pl
Useless use of hash element in void context at test.pl line 12.
Useless use of concatenation (.) or string in void context at test.pl line 18.
1
2
Can't use string ("route") as a subroutine ref while "strict refs" in use at test.pl line 15.
$

電話をかける正しい方法は何route()ですか?

4

2 に答える 2

13

シンボル参照として$h{a}を使用しようとしています。そして、それは「厳密に使用する」ことによって明示的に禁止されています。厳密モードをオフにすると、次のように実行できます。

no strict;
&{$h{a}};

ただし、最善のアプローチは、サブルーチンへの「実際の」参照をハッシュに格納することです。

#!/usr/bin/perl

use strict;
use warnings;

sub route {
    print "hello, world!";
}

my %h;
$h{a} = \&route;

$h{a}->();
于 2010-10-01T11:58:24.577 に答える
3

ルーチン名を含む文字列をサブとして逆参照する必要があります。括弧はオプションです。

my $name = 'route';
&{$name};

ルーチン名はハッシュ値であるため、ハッシュから抽出する必要があります。また、使用している場合strict(これは良い習慣です)、ローカルでチェックを無効にする必要があります。

{
    no strict 'refs';
    &{$h{a}};
}

ただし、davorgが彼の回答で示唆しているように、ルーチン名ではなく、サブへの参照をハッシュに直接格納する方が(パフォーマンス的に)優れています。

于 2010-10-01T15:47:47.893 に答える