你可以通过特殊的%Foo::Bar::Stix::
变量访问它。这可以直接访问符号表。你还会注意到它在严格模式下工作。
#! /usr/bin/env perl
use strict;
use warnings;
{
package Foo::Bar::Stix;
sub a{ print "sub a\n" }
sub b{ print "sub b\n" }
sub c{ print "sub c\n" }
}
my @funcs = qw' a b c ';
my %args;
for my $func (@funcs) {
$Foo::Bar::Stix::{$func}->(%args); # <====
}
另一种选择:
my $symbol_table = $::{'Foo::'}{'Bar::'}{'Stix::'};
my %funcs = (
# we only want the CODE references
'a' => *{ $symbol_table->{'a'} }{'CODE'},
'b' => *{ $symbol_table->{'b'} }{'CODE'},
'c' => *{ $symbol_table->{'c'} }{'CODE'},
);
for my $func (@funcs) {
$funcs{$func}->(%args); # <====
}
如果你要那么做了大量的子程序,这是我会怎样加载了%funcs
变量。
my %funcs;
BEGIN{
my $symbol_table = $::{'Foo::'}{'Bar::'}{'Stix::'};
for my $name (qw' a b c '){
$funcs{$name} = *{ $symbol_table->{$name} }{'CODE'};
}
}
,除非你需要的子程序同时拥有一个完全合格的名称,并通过散列变量访问它,我不会这么做。
如果你只需要通过散列变量访问子程序,这是一个更好的设置方法。
my %funcs = (
'a' => sub{ print "sub a\n" },
'b' => sub{ print "sub b\n" },
'c' => sub{ print "sub c\n" },
);
注:你可以取代 “my %funcs
” 与 “our %funcs
”
+1用于链接到大小写问题。如果你认为Perl是PERL,你的业力将会非常糟糕,以至于没有什么可行的。 – innaM 2009-08-05 08:46:37
`$ Foo :: Bar :: Stix :: {$ func} - >(%args);`也可以工作,并且不需要关闭严格。 – 2009-08-12 15:55:04