Pourquoi Win32 :: TieRegistry ne peut-il pas répertorier les sous-clés ?
Question
Utilisation de Cygwin Perl v5.8.8 et Win32 :: TieRegistry 0.26.
Nous pouvons obtenir un objet de hachage lié pour HKEY_CURRENT_USER :
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER"};
print Dumper $Key;'
$VAR1 = bless( {}, 'Win32::TieRegistry' );
Et cela fonctionne pour les sous-clés :
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key;'
$VAR1 = bless( {}, 'Win32::TieRegistry' );
Et nous pouvons imprimer les informations sur la clé :
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key->Information;'
$VAR1 = 'CntSubKeys';
$VAR2 = 48;
$VAR3 = 'MaxSubClassLen';
$VAR4 = 21;
...
Cependant, la documentation implique que nous pouvons lister les sous-clés simplement en les traitant comme un hachage :
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key; '
Mais le tableau est vide.Est-ce cassé ou est-ce que je fais quelque chose de mal ?Existe-t-il une autre façon de lister les sous-clés ?
Cela ne fonctionne pas non plus :
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key->SubKeyNames;'
Can't use an undefined value as an ARRAY reference at
/usr/lib/perl5/vendor_perl/5.8/cygwin/Win32/TieRegistry.pm line 720.
La solution
Avec votre code :
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key;
J'obtiens ce résultat sur ma machine (WinXP, ActiveState Perl v5.10.0, Win32-TieRegistry 0.25) :
$VAR1 = 'Adobe\\';
...
$VAR101 = 'Classes\\';
$VAR102 = '\\';
et voici ce que j'obtiens avec votre deuxième exemple de code :
$VAR1 = 'Adobe';
...
$VAR101 = 'Classes';
Ainsi, vos deux exemples de code fonctionnent correctement, au moins sur ActiveState Perl et Windows XP.
MODIFIER:Cela ressemble à un problème/bug plus général :
- Le module TieRegistry ne parvient pas à énumérer les valeurs sur community.activestate.com
- Win32 :: TieRegistry Erreur (ou est-ce moi ?) sur prlmnks.org
- un article de blog sur weblog.siliconcerebrate.com
- tout cela semble être lié à Windows Vista