2010-11-25 3 views
0

xxx46을 통해 XML 파일을 통과하는 작은 Perl 스크립트를 작성하고 있습니다.Perl에서 다른 유형의 해시 값을 테스트하고 있습니까?

my $xml = new XML::Simple; 
my $detail= $xml->XMLin($xml_local); 

가끔 XML의 요소 내용이 비어 있습니다.

XML의 요소에 내용이 없는데 다음을 사용하여 내용을 인쇄하려고합니다.

print $detail->{Parsing}->{Through}->{XML}->{ElementContents} 

결과가 나타납니다.

HASH(0x18948c4)

... ... 또는 뭔가 비슷한 ..... 유일한 차이점은() 사이의 문자입니다

콘텐츠가 비어 있는지 및 변수를 다른 뭔가 - 어쩌면 '' 또는 "" - 아무것도 테스트하려면 원하는 하지만 해쉬 참조/주소/뭐든간에.

가 I이 시도했지만있어 오류가 자사하지 배열 참조 :

print $detail->{Parsing}->{Through}->{XML}->{ElementContents}[0]


UPDATE Data::Dumper을 이용하여 소자들 중 하나의

출력 :

'something' => [ 
      { 
      'somedetail' => '', 
      'somedetail' => '', 
      'somedetail' => 'http://www.google.com' 
      'somedetail' => 'google', 
      'somedetail' => '1', 
      'somedetail' => '01/21/02' 
      }, 

펄을 사용하여 '' 빈 문자열을 테스트하려면 어떻게해야합니까? 일부 필터링이 사용 가능하지 않으면 HASH(0x18948c4)으로 리턴됩니다.

답변

3

HASH(0x18948c4)이 인쇄되는 이유는 그 값의 내용이 실제로 비어 있지만 해시 참조이기 때문입니다. 뭔가를 출력 할 때 Perl은 그 문자열을 문자열로 변환하려고 시도하며 해시 참조의 문자열로 결과는 HASH(address)입니다. 여기서 address는 실제 해시의 주소입니다.

인쇄가 hashref의 실제 내용을 다음과 같이

use Data::Dumper; 
print Data::Dumper->Dump([$detail->{Parsing}->{Through}->{XML}->{ElementContents}]); 

당신이 "어떤 내용이"없다 말하는 것처럼, 아마 빈 hashref 될 경우 :

$VAR1 = {}; 

그렇다면, ,

if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({}) 
    && !keys %{ $detail->{Parsing}->{Through}->{XML}->{ElementContents} }) 
    print "No contents, empty hashref"; 
} 

첫 번째 조건은 둘째, hashref의 보장 해시는 : 당신은을 통해 확인할 수 있습니다 그것의 역 참조 (dereference)의 결과는 그 열쇠로서 제로 요소를 가지며, 이는 참조되는 빈 해시임을 의미합니다.

그러나 나는 XML :: Simple에 대해 기억하고있는 것 중에서 빈 해시을 심각하게 의심합니다. 위의 그림과 같이 Data :: Dumper 인쇄를하면 어떻게 처리 할 수 ​​있는지 보여줍니다. 이런 식으로 알 수없는 데이터 구조를 인쇄하여 무엇을해야하는지 파악해야합니다.

예.데이터 :: 덤퍼 출력 된 경우 :

$VAR1 = { 
      'a' => 1 
     }; 

은 그럼 당신은 분명히 $detail->{Parsing}->{Through}->{XML}->{ElementContents}->{a}를 인쇄해야합니다. 다시 말하지만, arrayref 나 hashref가 아닌 스칼라 만 인쇄하면되므로 스칼라에 도달하는 데 필요한만큼 데이터 구조를 사용하십시오.

+0

'Data :: Dumper' -'Element '=> {content}의 결과를 사용하여''Element'=> {{'} – CheeseConQueso

+0

의 결과를 얻었습니다. print 문 – CheeseConQueso

+0

if 문에 대한 오류가 발생했습니다 : 'script.pl 줄 xx에서 ARRAY 참조가 아닙니다.'- 두 가지 테스트의 첫 번째 부분을 꺼내려고합니다. – CheeseConQueso

0

이 나를 위해 일 DVK의 답변의 수정 된 버전입니다 :

if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({})) 
{ 
    ...empty element content... 
} 

나는 if(condition1 && condition2) 문의 두 번째 조건을 제거하는 데 필요한 그가 내게 준.

+0

이것은 우연히 만 작동합니다. ref ({})는 공백을 검사하지 않으며, 오직 해시 코드만을 검사합니다. ref ({})의 값은 문자열 "해시"입니다. – DVK

+0

나는 당신이 말하는 것을 이해한다고 생각하지만 foreach 루프를 통해 이것을 실행할 때 빈 값에 대한 참조 만 선택됩니다 ... 비 공백 값은 통과합니다 – CheeseConQueso

관련 문제