我有一个可以获得注册表项值的脚本。这是代码。
use strict;
use warnings;
my $winRegistryStatus=0;
eval {
require Win32::Registry;
Win32::Registry->import();
};
unless($@) {
$winRegistryStatus=1;
}
my $registryPath = "Self\Random";
my $keyName = "Configure";
my $registryKeySettings;
my %registrySubKeyValues;
$main::HKEY_LOCAL_MACHINE->Open($registryPath, $registryKeySettings) || die "Cannot open $registryPath: $!";
$registryKeySettings->GetValues(\%registrySubKeyValues); # get sub keys and value -hash ref
foreach my $subKey (keys %registrySubKeyValues) {
my $_subKey = $registrySubKeyValues{$subKey};
next unless $$_subKey[0] eq $keyName;
print "Configure=" . $$_subKey[2];
}
输出
Name "main::HKEY_LOCAL_MACHINE" used only once: possible typo at ....
Configure=Yes
我可以获得Configure的值,但它也会返回一个警告,我不知道如何修复它。
任何身体我错了,可以告诉我如何解决它?
感谢。
答案 0 :(得分:4)
“仅使用一次”是use warnings
发出的警告,因为您只使用了$main::HKEY_LOCAL_MACHINE
一次。你在这里没有错。这只是暗示你可能忘记了什么。
在这种情况下,你可以忽略它,或者只是停用那种警告:没有警告'一次'。
一般情况下,最好将这些内容放在BLOCK
中,然后在其中添加一个长的描述性注释,以解释为什么要在此处关闭此类警告。
{ # Disable 'used only once' warning because the $::HKEY_...
# var was imported by Win32::Registry and is not used anywhere else.
$main::HKEY_LOCAL_MACHINE->Open($registryPath, $registryKeySettings)
|| die "Cannot open $registryPath: $!";
}
您可以找到有关warnings
here的更多信息。
答案 1 :(得分:2)
这个模块相当奇怪,它将符号导出到main
包,无论它在何处使用。
但在您的情况下,这就是您想要的:您的计划位于main
,因为您没有package
语句,您可以省略main::
中的$HKEY_LOCAL_MACHINE
。
关于您的问题,您显示的代码不会引发您说它的警告。问题必定在其他地方。请您出示完整的代码,以便我们为您提供更好的建议。
同时请注意@SinanÜnür的建议 - Win32::TieRegistry
优于Win32::Registry
。即使是Win32::Registry
的POD文档也说明了这一点:
注意:此模块提供了一个非常笨重的界面来访问 Windows注册表,目前尚未积极开发。它 仅用于向后兼容使用它的旧代码。对于 更强大,更灵活的方式来访问注册表,使用 的Win32 :: TieRegistry。
<强>更新强>
我理解您的问题更新时遇到的问题,这是因为您在运行时正在执行require Win32::Registry
。这意味着$HKEY_LOCAL_MACHINE
在编译时不存在,因此编译器会抱怨它。
修复是在编译时使用
声明它our $HKEY_LOCAL_MACHINE
在程序的顶部。
顺便说一句,如果你需要的只是这个标量,就不需要import
调用。