3

レジストリキーの値を取得するスクリプトがあります。これがコードです。

    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の値を取得できましたが、修正方法がわからないという警告も返されます。

私が間違っていて、それを修正する方法を教えてくれる体はありますか?

ありがとう。

4

2 に答える 2

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 こちらを参照してください。

于 2012-07-23T08:28:21.893 に答える
2

mainこのモジュールは、使用場所に関係なく、シンボルをパッケージにエクスポートするという点でかなり奇妙です。

しかし、あなたの場合、これはあなたが望むものです:あなたのプログラムはあなたがステートメントmainを持っていないのであり、 fromを省略できます。packagemain::$HKEY_LOCAL_MACHINE

あなたの問題に関しては、あなたが示すコードは、あなたが言う警告を発生させません。問題は別の場所にあるはずです。より良いアドバイスができるように、完全なコードを表示してください。

それまでの間、@Sinan Ünür のアドバイスに注意してWin32::TieRegistryくださいWin32::Registry。のPODドキュメントでさえ、次のようにWin32::Registry述べています。

注: このモジュールは、Windows レジストリにアクセスするための非常に扱いにくいインターフェイスを提供し、現在積極的に開発されていません。それを使用する古いコードとの下位互換性のためにのみ存在します。より強力で柔軟な方法でレジストリにアクセスするには、Win32::TieRegistry を使用します。


アップデート

あなたの質問の更新を見て問題を理解しました。それはrequire Win32::Registry実行時に実行しているためです。つまり$HKEY_LOCAL_MACHINE、コンパイル時に存在しないため、コンパイラはそれについて不平を言います。

修正は、コンパイル時に宣言することです

our $HKEY_LOCAL_MACHINE

プログラムの上部にあります。

ちなみに、importこのスカラーだけが必要な場合は、呼び出す必要はありません。

于 2012-07-23T10:48:59.720 に答える