конкретное ключевое значение из хэша

#perl #hash

#perl #хэш

Вопрос:

Мне интересно только узнать значение ключа «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%system32sppsvc.exe,-101
Start = 2
ImagePath = %SystemRoot%system32sppsvc.exe
Description = @%SystemRoot%system32sppsvc.exe,-100
DelayedAutoStart = 1
ObjectName = NT AUTHORITYNetworkService
RequiredPrivileges = SeAuditPrivilege SeChangeNotifyPrivilege         
SeCreateGlobalPrivilege SeImpersonatePrivilege
FailureActions = ÇQ☺         ♥   ¶   ☺   └È☺ ☺   Óô♦︎
DependOnService = RpcSs
Type = 16
  

Комментарии:

1. Попробуйте после удаления print Dumper(%vals);

2. Это уже прокомментировано, но все равно печатается намного больше.

3. ВСЕГДА используйте use strict; use warnings; . Это выявило бы вашу проблему

Ответ №1:

Пожалуйста, добавьте 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";
}