Vous pouvez y accéder via la variable %Foo::Bar::Stix::
spéciale. Cela donne un accès complet directement à la table des symboles. Vous remarquerez également que cela fonctionne en mode strict.
#! /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); # <====
}
Une autre option:
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); # <====
}
Si vous allez faire que pour un grand nombre de sous-routines, voici comment je charger la variable %funcs
.
my %funcs;
BEGIN{
my $symbol_table = $::{'Foo::'}{'Bar::'}{'Stix::'};
for my $name (qw' a b c '){
$funcs{$name} = *{ $symbol_table->{$name} }{'CODE'};
}
}
Je ne ferais pas cela à moins que vous avez besoin des sous-routines d'avoir à la fois un nom complet et l'accès à travers une variable de hachage.
Si vous avez seulement besoin d'accéder aux sous-programmes via une variable de hachage, c'est une meilleure façon de le configurer.
my %funcs = (
'a' => sub{ print "sub a\n" },
'b' => sub{ print "sub b\n" },
'c' => sub{ print "sub c\n" },
);
Note: vous pouvez remplacer "my %funcs
" par "our %funcs
"
+1 pour lier à la question de capitalisation. Votre karma sera si mauvais que rien ne fonctionnera si vous pensez à Perl comme PERL. – innaM
'$ Foo :: Bar :: Stix :: {$ func} -> (% args);' fonctionnerait aussi, et ne nécessite pas de désactiver strict. –