¿Por qué Win32::TieRegistry no puede enumerar las subclaves?
Pregunta
Usando Cygwin Perl v5.8.8 y Win32::TieRegistry 0.26.
Podemos obtener un objeto hash vinculado para 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' );
Y esto funciona para subclaves:
$ 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' );
Y podemos imprimir información para la clave:
$ 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;
...
Sin embargo, la documentación implica que podemos enumerar las subclaves simplemente tratándolas como un hash:
$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key; '
Pero la matriz está vacía.¿Está roto o estoy haciendo algo mal?¿Existe otra forma de enumerar las subclaves?
Esto tampoco funciona:
$ 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.
Solución
Con tu código:
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key;
Obtengo este resultado en mi máquina (WinXP, ActiveState Perl v5.10.0, Win32-TieRegistry 0.25):
$VAR1 = 'Adobe\\';
...
$VAR101 = 'Classes\\';
$VAR102 = '\\';
y esto es lo que obtengo con tu segundo ejemplo de código:
$VAR1 = 'Adobe';
...
$VAR101 = 'Classes';
Entonces, ambos ejemplos de código funcionan bien, al menos en ActiveState Perl y Windows XP.
EDITAR:Esto parece un problema/error más general:
- El módulo TieRegistry no puede enumerar valores en community.activestate.com
- Win32::TieRegistry Error (¿o soy yo?) en prlmnks.org
- una publicación de blog en weblog.siliconcerebrate.com
- Todo parece estar relacionado con Windows Vista.