2010-11-25 58 views
0

我通過XML::Simple在Perl中測試不同類型的哈希值?

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

寫一個小Perl腳本,通過一個XML文件去有時,一個元素在XML內容是空的。

當在XML中的一個元素沒有內容,我嘗試使用打印出來的內容:

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

我得到的輸出:

HASH(0x18948c4)

... ...或類似的東西......唯一的區別是()之間的字符

我想測試內容是否爲空,並將該變量默認爲別的東西 - 也許''"" - 除了散列引用/地址/不管是什麼。

我嘗試這樣做,但得到的是它不是一個數組引用一個錯誤:

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' 
      }, 

如何使用Perl測試這些''空字符串?除非啓用某些過濾,否則它們將返回爲HASH(0x18948c4)

回答

3

它打印HASH(0x18948c4)的原因是因爲該值的內容其實不是空的,而是一個hashref。當您打印某些內容時,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"; 
} 

第一個條件確保它是散列參數,第二個條件是散列值由於其解引用導致其元素爲零,這意味着它是一個空引用的哈希。

但是,我真的懷疑它是一個空的散列從我記得關於XML :: Simple - 並且執行Data :: Dumper打印如上所示將告訴你如何處理它。你應該總是用這種方式打印出未知的數據結構來找出如何處理它們。

E.g.,如果你的Data :: Dumper輸出是:

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

然後你需要打印$detail->{Parsing}->{Through}->{XML}->{ElementContents}->{a},很明顯。同樣,小心只打印標量而不是arrayref或hashref,因此請根據需要按照需要去數據結構以獲得標量。

+0

我也用`Data :: Dumper`打印出了數據結構 - 'Element'=> {content}結果爲`'Element'=> {}` – CheeseConQueso 2010-11-25 00:38:28

+0

也是,你錯過了第一個'{`打印語句 – CheeseConQueso 2010-11-25 00:40:31

0

這是爲我工作DVK的回答修改後的版本:

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

我需要刪除if(condition1 && condition2)聲明的第二個條件是他給了我。