2012-06-01 31 views
3

我輸入XML文件是:爲什麼我用Perl XML :: Simple獲得這個「不是數組引用」?

<?xml version='1.0'?> 
<warnings> 
<IDA> 
    <file>filea</file> 
    <path>patha</path> 
</IDA> 

<IDA> 
    <file>fileaa</file> 
    <path>pathaa</path> 
</IDA> 

<IDB> 
    <file>fileb</file> 
    <path>pathb</path> 
</IDB> 

</warnings> 

我讀這個文件是這樣的:

my @IDs = ("IDA", "IDB"); 
my $data = $xml->XMLin("xmlfile.xml"); 
foreach (@IDs) 
{ 
foreach $id (@{$data->{$_}}) 
{ 
    print $id->{path}."\n"; 
} 
} 

,當我運行該腳本它給了我這個錯誤:

Not an ARRAY reference at ./waiver.pl line 18. 

(第18行是第二個foreach循環)

編輯 我重複了IDA標記。

+2

您是否嘗試過perl -d模式? 'n'到第18行,然後'x'的東西像'$ _','$ data - > {$ _}'等等。 – aschepler

+0

抱歉,我沒有得到它?你能解釋一下嗎? – infinitloop

+0

他意味着使用Perl調試器與-d選項 – m0skit0

回答

5

{$data->{$_}不是有效的數組引用,因爲您只有一個IDA標記,因此不會構建數組。您可以在XMLin中使用ForceArray強制每個標記成爲一個數組,即使只有一個標記。

my $data = $xml->XMLin("xmlfile.xml", ForceArray => 1); 

編輯:現在它給錯誤與美洲開發銀行標籤...

或者您可以使用ref()檢查,如果它是一個數組或散列引用:

if (ref({$data->{$_}) eq 'ARRAY') 
{ 
    foreach $id (@{$data->{$_}}) 
    { 
     etc... 
    } 
} 

PS :我也可以建議使用keys()函數來檢索散列鍵,而不是將它們放在單獨的數組中。

+0

是的,就是這樣。有沒有辦法處理這種情況? – infinitloop

+0

我已經告訴你如何處理它,但這裏有另一種選擇。 – m0skit0

+1

我通常建議每個人都使用'ForceArray',無論如何你會削減它返回兩種不同類型的變量是最終用戶的巨大負擔。這實際上讓許多圖書館(比如DBIC)困惑不已。 –

相關問題