首页 > 解决方案 > 哈希中的特定键值

问题描述

我只想知道键“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

标签: perlhash

解决方案


请在您的代码中添加use strict和。use 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";
}

推荐阅读