2014-06-07 2 views
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}/) {.... 

과 같이 작동하지 않습니다. 빈 키를 어디에서 가져 왔는지 확실하지 않습니다.

+2

'if'조건이 충족되고 'delete'가 실행됩니까? – choroba

+0

예. 그것은 데이터를 삭제하지만 기본/최상위 수준의 키 구성은 내가 삭제하더라도 ** 삭제 $ check_configs {config}; ** 삭제되지 않습니다 ** check_configs {config} ** 삭제 이유는 궁금 해서요 최상위 수준 키와 모든 하위 값을 삭제합니다. – nohup

+0

재생할 수 없습니다 :'perl -MData :: Dumper -we '% c = (config => {a => 11}); $ c {config}를 삭제하십시오; print Dumper \ % c; '' – choroba

답변

2

다음 코드를 사용했습니다.

 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 ; 
관련 문제