perl - 为什么 Win32::TieRegistry 不能列出子项?

标签 perl winapi registry tie

使用 Cygwin Perl v5.8.8 和 Win32::TieRegistry 0.26。

我们可以为 HKEY_CURRENT_USER 获取绑定(bind)的哈希对象:

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

我们可以打印 key 的信息:

$ 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 上是这样。

编辑:这看起来像是一个更普遍的问题/错误:

关于perl - 为什么 Win32::TieRegistry 不能列出子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/678015/

相关文章:

perl - 如何在 Perl 中验证图像文件?

c++ - 提示重新启动进程以获取管理权限

C# 可能不是安全应用程序的最佳选择?

c# - .NET 中的 SetForegroundWindow 问题

batch-file - 使用批处理文件读取包含空格的注册表值

c# - 如何将凭据传递到计算机以便我可以在其上使用 Microsoft.Win32.RegistryKey.OpenRemoteBaseKey()?

java - 如何从 java 中的 perl 获得 "tr///"运算符的相同结果

perl - 如何获取取消引用的匿名数组的第 n 个元素?

regex - 为什么我不能将正则表达式存储在变量中?

c++ - Vista\Win7 中的模拟和注册表操作