2014-04-20 3 views
0

나는 Perl에서 해시의 해시를 다루고 있으며 몇 가지 문제가있다. 내 코드가 실행되고 있는지 잠시 후에는이 비슷한 모양 해시의 해시 생성삭제되었지만 여전히 정의되어 있습니까?

my %book = (
    +1 => { 
     27 => 100, 
     24 => 1000, 
    }, 
    -1 => { 
     30 => 200, 
     31 => 500, 
    } 
); 

좀 더 많은 데이터를 처리 한 후이 코드는 다음과 같은 사용하여 해시의 두 항목을 제거 끝 코드 줄 :

delete $book{-1}{30}; 
delete $book{-1}{31}; 

따라서 해시는 절반 비어 있어야합니다.

if ((defined $book{+1}) && (defined $book{-1})){ 
    do A 
}else{ 
    do B 
} 

내 코드가 아니라 그가의 "-1"쪽부터해야 "일이 B"가 아닌 "일이 A"를하고 끝 : 나중에 내 코드에서 내가 실행할 때 문이 경우, 다음과 같은 해시가 삭제되었습니다. 이것이 어떻게 가능한지? 그리고 가장 중요한 것은이 문제를 어떻게 해결할 것인가?

+3

는 답변 만 변경하지 않는 것이 좋습니다 놀라게 테스트 및 작동하고 당신의'테스트에 && % {$ 책은 {-1}}은' – ysth

답변

5

%{$books{-1}} 내의 두 항목을 삭제하면 해시 참조 $books{-1}이 여전히 비어 있어도 여전히 존재합니다.

use strict; 
use warnings; 

my %book = (
    +1 => { 
     27 => 100, 
     24 => 1000, 
    }, 
    -1 => { 
     30 => 200, 
     31 => 500, 
    } 
); 

delete $book{-1}{30}; 
delete $book{-1}{31}; 

use Data::Dump; 
dd \%book; 

출력 : 당신이 항목을 손질하려는 경우

{ -1 => {}, 1 => { 24 => 1000, 27 => 100 } } 

, 당신은 그

# Trim Hash 
my @empty_keys = grep {!%{$book{$_}}} keys %book; 
delete $book{$_} for @empty_keys; 

업데이트에 대한 명시 적 논리를 코딩해야합니다

ysth가 제안했듯이, 하나의 대체 솔루션은

if (! grep {!$book{$_} || !%{$book{$_}}} qw(1 -1)) { 
    print "A\n"; 
} else { 
    print "B\n"; 
} 
+0

+1이 경우 다음의 항목을 잡기 위해 꽤 좋은 방법 그게 전부 'HoH'는 값이없는'keys '를 의미합니다. 공유해 주셔서 감사합니다. –

+1

아니면 그냥 :'delete @book {grep! % {$ book {$ _}}, keys (% book)}; ' – ikegami

+0

'! % {$ book {$ _}}'은'! 키 (% {$ book {$ _}})'를 사용합니다. – ikegami

0

이 오히려 불필요한 해시 요소를 제거하는 것보다, 내가 일반

I에서 할 너무 단단하지 않다 빈 해시에 탄력 %book를 사용하는 코드를 만들 것을 선호 : SH 키는 빈 대신했다 동일한 숫자를 나타낼 수있는 문자열이 많기 때문에 숫자 키로 해시를 사용하는 것에 매우주의해야합니다. 예를 들어, '1' == '1.0' 있지만, '1' eq '1.0'거짓이며, 값이 해시 키로서 사용 된 경우 서로 다른 요소

그 단서 조항으로

, 나는 내가 다음

를 작성합니다 참조 할 사실입니다 미안 해요, 나는 현재 일할 태블릿 만 가지고 있으며, IDE는 출력 텍스트를 복사하여 여기에 붙여 넣지 못하게합니다. 그러나

use strict; 
use warnings; 

my %book = (
    +1 => { 
    27 => 100, 
    24 => 1000, 
    }, 
    -1 => { 
    30 => 200, 
    31 => 500, 
    } 
); 

# $book{-1} becomes an empty hash 
delete $book{-1}{30}; 
delete $book{-1}{31}; 

# remove elements that have no content 
for (keys %book) { 
    delete $book{$_} unless keys %{ $book{$_} }; 
} 

use Data::Dumper; 
$Data::Dumper::Useqq = 1; 
print Dumper \%book; 
+0

Borodin에게 답장을 보내 주셔서 감사합니다. '$ Data :: Dumper :: Useqq = 1;이 무엇을하는지 제발 설명해 주시겠습니까? –

+0

문자열이 큰 따옴표로 표시되고 공백 및 제어 문자가 해당 이스케이프 시퀀스에 따라 표현되도록 출력 형식을 변경합니다. 그것은 뒤에 오는 개행 문자와 삽입 된 탭 문자를 찾아내는 것이 훨씬 더 쉽습니다. – Borodin

+0

답에도 감사드립니다. for 문에서 "키"를 제거하면 코드가 더 이상 작동하지 않는 이유를 이해할 수 없습니다. for 루프를 for (keys % book) {if (! % {$ book {$ _}}) {delete $ book {$ _}} '으로 다시 쓰면, 열쇠 ?? –

관련 문제