你可以通過特殊的%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