Почему я не могу распечатать хеш-таблицу в хеш-формате?

У меня есть следующий фрагмент в 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 в анонимную ссылку на хеш.
Почему я не получаю хеш-подобный вывод, когда я выгружаю хеш-таблицу?


person Cratylus    schedule 12.10.2013    source источник


Ответы (1)


Dumper принимает список скаляров для дампа. Передайте ссылки на хэши и массивы, если хотите их сбросить.

print Dumper(\%media); 
person mpapec    schedule 12.10.2013
comment
Хотя это форма обходного пути, верно? Я имею в виду, как я узнаю из печати, как в OP, используется ли хэш или список? - person Cratylus; 13.10.2013
comment
@Cratylus, если у подпрограммы нет хэша прототипа, всегда передается как список - person mpapec; 13.10.2013
comment
При нормальных обстоятельствах списки выравниваются. Хэш в контексте списка возвращает список пар ключ=>значение без определенного порядка ключей. print Dumper %hash выравнивает хеш в список. print Dumper \%hash передает хэш-ссылку в Dumper, и вы получаете более традиционный формат хеш-дампа. Я бы не назвал это обходным путем — это просто то, как это делается. Сглаживание списка — это функция. Хеш-ссылки также являются особенностью языка. - person DavidO; 13.10.2013