2013-10-12 280 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