use 5.010;
use strict;
use warnings;
{
no warnings 'once';
$A::B::C::D = 5; # a test subject
}
my $pkg = 'A::B::C';
my $var = 'D';
# tearing down the walls (no warranty for you):
say eval '$'.$pkg."::$var"; # 5
# tearing down the walls but at least feeling bad about it:
say ${eval '\$'.$pkg."::$var" or die [email protected]}; # 5
# entering your house with a key (but still carrying a bomb):
say ${eval "package $pkg; *$var" or die [email protected]}; # 5
# using `Symbol`:
use Symbol 'qualify_to_ref';
say $${ qualify_to_ref $pkg.'::'.$var }; # 5
# letting us know you plan mild shenanigans
# of all of the methods here, this one is best
{
no strict 'refs';
say ${$pkg.'::'.$var}; # 5
}
et si le sens pour vous suivre, un rapport sur:
# with a recursive function:
sub lookup {
@_ == 2 or unshift @_, \%::;
my ($head, $tail) = $_[1] =~ /^([^:]+:*)(.*)$/;
length $tail
? lookup($_[0]{$head}, $tail)
: $_[0]{$head}
}
say ${ lookup $pkg.'::'.$var }; # 5
# as a reduction of the symbol table:
use List::Util 'reduce';
our ($a, $b);
say ${+ reduce {$$a{$b}} \%::, split /(?<=::)/ => $pkg.'::'.$var }; # 5
Et bien sûr, vous pouvez attribuer à aucune de ces méthodes au lieu de say
les ing.
Il est mauvais de bricoler avec d'autres variables de paquets. Perl le permet, mais vous faites violence à la conception de l'autre paquet. Bien sûr, il y a une mise en garde: si la variable est exportée par le paquet (non recommandé, mais certainement faisable), alors vous pouvez avoir l'autorisation de l'utiliser et vous n'avez alors rien d'autre à faire que de lui assigner. –
@Jonathan: Je dois mettre à jour un ancien code. Avant, il fallait 'require magic_config_file.pl;' (à partir du chemin absolu) quand il avait besoin de sa configuration. Je le passe à un module qui peut lire les fichiers de configuration locaux appropriés, mais pour la rétrocompatibilité, je dois définir '% main :: SOME_DB = (hôte => 'blah', utilisateur => 'blah' ....' – viraptor
@Jonathan Leffler: une plus grande mise en garde: si elle est documentée que vous pouvez (par exemple Data :: Dumper, Text :: Wrap, etc.) – ysth