Вы можете получить к нему доступ через специальную переменную %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
"