2011-10-03 27 views
1

我有以下XML文件:如何在Perl中讀取哈希數據?

<?xml version='1.0'?> 
<preferences> 
    <font role="console"> 
     <fname>Courier</fname> 
     <size>9</size> 
    </font> 
    <font role="default"> 
     <fname>Times New Roman</fname> 
     <size>14</size> 
    </font> 
    <font role="titles"> 
     <fname>Helvetica</fname> 
     <size>10</size> 
    </font> 
</preferences> 

我設法閱讀並傾倒出來。現在我應該讀取所​​有的鍵值對。

下面是腳本:

#!/usr/bin/perl 

use warnings; 
use strict; 
# use module 
use XML::Simple; 
use Data::Dumper; 

my $data = XMLin('test.xml'); 

# print Dumper(%data); 


while (my ($key, $value) = each(%$data)) { 
    print "$key => $value\n"; 
} 

循環內不打印......這可能是什麼問題呢?我是新手,在同一天寫了我的Hello World腳本,所以我會對代碼採取任何建議。

這只是正常:

my $data = XMLin('test.xml'); 
print Dumper($data); 

,這讓我:

$VAR1 = { 
      'font' => [ 
        { 
         'fname' => 'Courier', 
         'role' => 'console', 
         'size' => '9' 
        }, 
        { 
         'fname' => 'Times New Roman', 
         'role' => 'default', 
         'size' => '14' 
        }, 
        { 
         'fname' => 'Helvetica', 
         'role' => 'titles', 
         'size' => '10' 
        } 
        ] 
     }; 

我猜測的while循環內我需要遍歷每個陣列。我對嗎?

+0

$ data vs%data? –

+0

指望我是一個白癡,並解釋你指的是什麼? –

+1

對於初學者來說,養成在所有代碼中包含'use strict'的習慣。在這種情況下(在將'$ data = ...'聲明爲'my $ data = ...'的行之後),它會抱怨你沒有聲明'%data' - 這會幫助你指出你立即在正確的方向。 :-) – BlairHippo

回答

7
use strict; 

是您的朋友。它會告訴你:

Global symbol "%data" requires explicit package name 

你想要的是%$data

換句話說:$data%data計爲兩個不同的變量。

更新:

當你改變了整個問題,我的回答讓現在沒有什麼意義。作爲做你的問題。你已經打印了它。你還需要什麼?

如果你想打印的結構,你需要像(未經測試):

for my $key1 (keys %$data) { 
    for my $array_value (@{ $data->{$key1} }) { 
     for my $key2 (keys %$array_value) { 
      print "$key2 => $array_value->{$key2}\n"; 
     } 
    } 
} 

如果您想直接訪問一個值:

print $data->{font}[0]{'fname'} 

你需要試驗以得到你需要的東西。在Data :: Dumper輸出中,可以很容易地看到哪些值是散列值,哪些值是數組值:

$VAR1 = { # The curly bracket denotes a beginning hash 
      'font' => [  # Square bracket = array begins 
        {  # The first array element is a hash 
         'fname' => 'Courier', # Inside the hash 
         'role' => 'console', 
         'size' => '9' 
        }, # Hash ends 
        {  # Next array value, new hash begins 
         'fname' => 'Times New Roman', 
         'role' => 'default', 
         'size' => '14' 
        }, 
        { 
         'fname' => 'Helvetica', 
         'role' => 'titles', 
         'size' => '10' 
        } 
        ]  # Array ends 
     }; # Hash ends 
+0

非常感謝你...... :)真棒幫助:) –

+0

非常歡迎你。祝你好運! – TLP

2

嘗試用:

while (my ($key, $value) = each(%$data)) {  
    ....