1
서브 루틴에서 해시 값 해시가 있습니다. 아래 코드 덩어리 붙여 넣기. perl 해시의 해시에 대한 값을 포함하여 최상위 수준/기본 해시 키를 삭제하는 방법
sub check_interfaces()
my @interfaces = IO::Interface::Simple->interfaces;
my ($ip, $subnet, $dscp) = @_;
my %check_config = (
"ip" => $ip,
"subnet" => $subnet,
"dscp" => $dscp
);
foreach my $if (@interfaces) {
if (not defined $if->address) {
next;
}
%check_configs = (config => \%check_config);
my %interface = ($if, $if->address);
if ($check_configs{config}{ip} && $check_configs{config}{ip} =~ /$interface{$if}/) {
print "$check_configs{config}{ip} already configured\n\n";
delete $check_configs{config}{ip};
delete $check_configs{config}{subnet};
delete $check_configs{config}{dscp};
delete $check_configs{config};
}
}
print Dumper %check_configs;
이
내가 차 해시 키를 삭제하려고했다[email protected]:/l3dsr# perl test.pl start
10.75.21.23 already configured
$VAR1 = 'config';
$VAR2 = {};
$VAR1 = 'config';
$VAR2 = {
'dscp' => '2',
'ip' => '10.75.130.24',
'subnet' => '255.255.255.255'
};
로 나에게 출력을주고있다,하지만도 삭제되지 않았습니다. 내가 삭제하고 있지 않다 경우, 출력은 내가 뭘하려고 오전
delete $check_configs{config}{ip};
delete $check_configs{config}{subnet};
delete $check_configs{config}{dscp};
delete $check_configs{config};
을 수행하여 해시
$VAR1 = 'config';
$VAR2 = {
'dscp' => '2',
'ip' => '10.75.21.23',
'subnet' => '255.255.255.255'
};
의 해시의 덩어리를 제거하는 것입니다
10.75.21.23 already configured
$VAR1 = 'config';
$VAR2 = {
'dscp' => '2',
'ip' => '10.75.21.23',
'subnet' => '255.255.255.255'
};
$VAR1 = 'config';
$VAR2 = {
'dscp' => '2',
'ip' => '10.75.130.24',
'subnet' => '255.255.255.255'
};
것 그러나 예상대로 작동하지 않습니다. 여기서 내가 뭘 잘못하고 있니?
삭제 직후에 덤퍼가 추가되었지만 인쇄되는 것이 없습니다. 그러나 키를 인쇄 중이며 여기서 키의 중복 된 항목을 볼 수 있습니다.
if ($check_configs{config}{ip} && $check_configs{config}{ip} =~ /$interface{$if}/) {
print "$check_configs{config}{ip} already configured\n\n";
delete $check_configs{config}{ip};
delete $check_configs{config}{subnet};
delete $check_configs{config}{dscp};
delete $check_configs{config};
print Dumper %check_configs;
}
}
print keys %check_configs;
출력 ::
[email protected]:/l3dsr# perl test.pl start
10.75.21.23 already configured
[email protected]:/l3dsr#
보로딘 :
$Data::Dumper::Useqq = 1;
print Dumper [ keys %check_configs ];
출력 ::
[email protected]:/l3dsr# perl test.pl start
10.75.21.23 already configured
$VAR1 = [
"config"
];
$VAR1 = {
"config" => {}
};
$VAR1 = [
"config"
];
$VAR1 = {
"config" => {
"dscp" => 2,
"ip" => "10.75.130.24",
"subnet" => "255.255.255.255"
}
};
업데이트 ::
으로나는
delete $check_configs{config}{subnet};
delete $check_configs{config}{dscp};
delete $check_configs{config};
}
}
if (!keys $check_configs{config}) {
delete $check_configs{config};
}
print keys %check_configs ;
는 빈 설정 키를 삭제 같이 삭제 $ 후 check_configs를 삭제를 추가하는 경우. 그러나 위에 추가하면
if (!keys $check_configs{config}) {
delete $check_configs{config};
}
if ($check_configs{config}{ip} && $check_configs{config}{ip} =~ /$interface{$if}/) {....
과 같이 작동하지 않습니다. 빈 키를 어디에서 가져 왔는지 확실하지 않습니다.
'if'조건이 충족되고 'delete'가 실행됩니까? – choroba
예. 그것은 데이터를 삭제하지만 기본/최상위 수준의 키 구성은 내가 삭제하더라도 ** 삭제 $ check_configs {config}; ** 삭제되지 않습니다 ** check_configs {config} ** 삭제 이유는 궁금 해서요 최상위 수준 키와 모든 하위 값을 삭제합니다. – nohup
재생할 수 없습니다 :'perl -MData :: Dumper -we '% c = (config => {a => 11}); $ c {config}를 삭제하십시오; print Dumper \ % c; '' – choroba