2013-10-12 164 views
2

我有下面的代碼片段在Perl:爲什麼我不能以散列格式打印散列表?

my $a1 = [ qw(rock pop musical) ]; 
my $b1 = [ qw(mystery action drama)]; 
my $c1 = [ qw(biography novel periodical)]; 

my %media = ( 
    music => $a1, 
    file => $b1, 
    print => $c1 
); 

我嘗試按以下步驟打印:

use Data::Dumper; 
print Dumper (%media); 

我得到這個:

$VAR1 = 'file'; 
$VAR2 = [ 
      'mystery', 
      'action', 
      'drama' 
     ]; 
$VAR3 = 'music'; 
$VAR4 = [ 
      'rock', 
      'pop', 
      'musical' 
     ]; 
$VAR5 = 'print'; 
$VAR6 = [ 
      'biography', 
      'novel', 
      'periodical' 
     ]; 

它打印出的哈希就像一個列表。我期待的是這樣的表示它是一個散列。

$VAR1 = { 
      'file' => [ 
         'mystery', 
         'action', 
         'drama' 
        ], 
      'music' => [ 
         'rock', 
         'pop', 
         'musical' 
        ], 
      'print' => [ 
         'biography', 
         'novel', 
         'periodical' 
        ] 
     }; 

但我只有這樣,如果我將%media轉換爲匿名散列引用。
爲什麼我在轉儲哈希表時爲什麼不能獲得類似散列的打印?

回答

5

Dumper將標量清單轉儲。如果要轉儲這些參數,請將引用傳遞給散列和數組。

print Dumper(\%media); 
+0

這是一種形式的工作 - 雖然對嗎?我的意思是,如何從OP中的打印中知道是否正在使用散列或列表? – Cratylus

+1

@Cratylus如果子程序沒有原型哈希總是作爲列表傳遞 –

+0

在正常情況下,列表被展平。列表上下文中的散列返回鍵=值對的列表,沒有特定的鍵順序。 'print Dumper%hash'將哈希放到列表中。 'print Dumper \%hash'將哈希參數傳遞給Dumper,並獲得更傳統的哈希轉儲格式。我不會說這是一種解決方法 - 它只是如何完成的。列表展平是一項功能。哈希引用也是該語言的一個特徵。 – DavidO