2011-01-27 3 views
2

Если у вас есть массив хэшей, в котором ключ представляет имя столбца, а значение представляет собой содержимое строки, что было бы лучшим способом для вывода этого в виде таблицы в perl?Perl output array of hashes as table

+1

Можете ли вы предоставить некоторый образец вывода? (Подсказка: как только вы это сделаете, вы сможете идентифицировать в псевдокоде то, что вам нужно сделать с вашим массивом хешей, и тогда вы сможете лучше задавать * конкретный * вопрос о той части, которую вы имеете трудности с.) – Ether

ответ

2

Имеются ли в каждой строке одинаковые ключи хэша? Это структура, которую вы получите, например. из DBI, что соответствует общепринятым свойствам таблиц (т. е. каждая строка имеет одинаковый набор столбцов). Вот пример того, что я имею в виду, и я надеюсь, что это соответствует тому, что вы думаете:

my @AoH = (
    {id => 1, name => 'Dick'}, 
    {id => 2, name => 'Jane'}, 
); 

В таких случаях Вы обычно знаете, что столбцы. Я сделаю это предположение. Здесь же есть код:

my @cols = qw(id name); 
my @AoH;     # as above 

# print the column headings 
print join "\t", @cols; 

# print values for each row using a hash slice 
for my $row_ref (@AoH) { 
    print join "\t", @$row_ref{@cols}; 
} 
1

Нравится?

my @AoH = (
    {a => 1, b => 2}, 
    {c => 3, d => 4}, 
); 

Это отображает N-мерную таблицу, где N - количество элементов в массиве. Вы не можете реально визуализировать его больше, чем N = 3, если только вы не рухнете хешей (то есть сделайте все это одним большим хешем.)

Если вы просто имеете в виду, что табулируйте «реверсивный» хеш, просто переставьте его:

my %a = (a => 1, b => 1); 

my %b = map { $a{$_} => $_ } keys %a; 

while (my ($k, $v) = each %b) { 
    printf("%s %s\n", $k, $v); 
} 
+1

альтернативно: 'my% b = reverse% a'. –