#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";
}