Почему Win32::TieRegistry не может перечислить подразделы?
Вопрос
Использование 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.
Решение
С вашим кодом:
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.
РЕДАКТИРОВАТЬ:Это похоже на более общую проблему/ошибку:
- Модуль TieRegistry не может перечислить значения на сайте Community.activestate.com.
- Ошибка Win32::TieRegistry (или это я?) на сайте prlmnks.org
- сообщение в блоге на сайте weblog.siliconcerebrate.com
- похоже, все это связано с Windows Vista