当使用Perl的Win32 :: Registry时,如何修复`“main :: HKEY_LOCAL_MACHINE”仅使用一次警告?

时间:2012-07-23 07:56:14

标签: perl registry warnings

我有一个可以获得注册表项值的脚本。这是代码。

    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的值,但它也会返回一个警告,我不知道如何修复它。

任何身体我错了,可以告诉我如何解决它?

感谢。

2 个答案:

答案 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调用。