您可以通过特殊的%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”