为什么 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 上
- 一篇博文 在博客.siliconcerebrate.com 上
- 整件事似乎与Windows Vista有关
不隶属于 StackOverflow