Почему Win32 :: TieRegistry не может подключиться к списку подразделов? - PullRequest
3 голосов
/ 24 марта 2009

Использование Cygwin Perl v5.8.8 и Win32 :: TieRegistry 0.26.

Мы можем получить объект связанного хеш-объекта для 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' );

И это работает для суб-ключей:

$ 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' );

И мы можем напечатать информацию для ключа:

$ 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;
...

Однако из документации следует, что мы можем перечислить подключи, просто обработав их как хеш:

$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key; '

Но массив пуст. Это сломано или я что-то не так делаю? Есть ли другой способ перечислить дополнительные ключи?

Это тоже не работает:

$ 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.

1 Ответ

2 голосов
/ 24 марта 2009

С вашим кодом:

my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key;

Я получаю этот результат на своей машине (WinXP, ActiveState Perl v5.10.0, Win32-TieRegistry 0.25):

$VAR1 = 'Adobe\\';
...
$VAR101 = 'Classes\\';
$VAR102 = '\\';

и вот что я получаю с вашим вторым примером кода:

$VAR1 = 'Adobe';
...
$VAR101 = 'Classes';

Так что оба ваших примера кода работают нормально, по крайней мере на ActiveState Perl и Windows XP.

РЕДАКТИРОВАТЬ: Это выглядит как более общая проблема / ошибка:

...