哈希中的特定键值

问题描述

我只想知道键“ DelayedAutoStart”的值,并希望此代码有效,但是它会打印出更多信息。有人可以告诉我这是怎么回事吗?

   use Win32::Registry;
   use Data::Dumper;
   $p = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";
   $p = "SYstem\\CurrentControlSet\\Services\\sppsvc";
   $main::HKEY_LOCAL_MACHINE->Open($p,$CurrVer) || 
    die "Open: $!";
   $CurrVer->GetValues(\%vals); 
   #print Dumper(\%vals);

   foreach $k (keys %vals) {
   $key = $vals{$k};
   if ($$key[0] == "DelayedAutoStart")
   {
   print "$$key[0] = $$key[2]\n"; 
   }
}

结果:

ServiceSidType = 1
ErrorControl = 1
LaunchProtected = 1
displayName = @%systemRoot%\system32\sppsvc.exe,-101
Start = 2
ImagePath = %systemRoot%\system32\sppsvc.exe
Description = @%systemRoot%\system32\sppsvc.exe,-100
DelayedAutoStart = 1
ObjectName = NT AUTHORITY\NetworkService
requiredPrivileges = SeAuditPrivilege SeChangeNotifyPrivilege         
SeCreateGlobalPrivilege SeImpersonatePrivilege
FailureActions = ÇQ☺         ♥   ¶   ☺   └È☺ ☺   Óô♦︎
DependOnService = RpcSs
Type = 16

解决方法

请在您的代码中添加use strictuse warnings。他们会给您一个错误,告诉您您使用的是错误的比较运算符。 ==等于运算符用于比较数字而不是字符串。您需要eq来进行字符串比较。

此外,您还使事情变得混乱,而不是将散列值存储在名为$key的变量中,并且通常使事情变得复杂得多!

foreach my $key (keys %vals) {

  if ($key eq "DelayedAutoStart")
  {
    print "$key = $vals{$key}[2]\n";
  }
}

但是,当然,您可以直接在哈希中查找值。无需迭代键。那几乎就是使用散列的重点:-)

my $key = 'DelayedAutoStart';
if (exists $vals{$key}) {
  print "$vals{$key} = $vals{$key}[2]\n";
}