Как я могу напечатать содержимое хэша в Perl? - PullRequest
151 голосов
/ 22 июля 2009

Я продолжаю печатать свой хэш как количество выделенных ящиков / #. Как мне распечатать содержимое моего хэша?

Без использования петли while будет наиболее предпочтительным (например, лучше будет однострочная ).

Ответы [ 11 ]

232 голосов
/ 22 июля 2009

Данные :: Дампер твой друг.

use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);

выведет

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };
58 голосов
/ 22 июля 2009

Легко:

print "$_ $h{$_}\n" for (keys %h);

Элегантно, но на 30% медленнее (!):

while (my ($k,$v)=each %h){print "$k $v\n"}
34 голосов
/ 15 марта 2012

Вот как можно печатать без использования Data::Dumper

print "@{[%hash]}";
21 голосов
/ 22 июля 2009

В целях отладки я часто буду использовать YAML.

use strict;
use warnings;

use YAML;

my %variable = ('abc' => 123, 'def' => [4,5,6]);

print "# %variable\n", Dump \%variable;

Результат:

# %variable
---
abc: 123
def:
  - 4
  - 5
  - 6

В других случаях я буду использовать Data::Dump. Вам не нужно устанавливать столько переменных, чтобы получить его для вывода в хорошем формате, чем для Data::Dumper.

use Data::Dump = 'dump';

print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }

Совсем недавно я использовал Data::Printer для отладки.

use Data::Printer;
p %variable;
{
    abc   123,
    def   [
        [0] 4,
        [1] 5,
        [2] 6
    ]
}

(результат может быть намного более красочным на терминале)

В отличие от других примеров, которые я показал здесь, этот предназначен явно только для демонстрации. Который появляется легче, если вы выкидываете структуру связанной переменной или объекта.

use strict;
use warnings;

use MTie::Hash;
use Data::Printer;

my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
{
    a   "A",
    b   "B",
    c   "C",
    d   "D"
} (tied to Tie::StdHash)

Tie::StdHash  {
    public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
    private methods (0)
    internals: {
        a   "A",
        b   "B",
        c   "C",
        d   "D"
    }
}
11 голосов
/ 22 июля 2009

Ответ зависит от того, что находится в вашем хеше. Если у вас есть простой хэш, то простой

print map { "$_ $h{$_}\n" } keys %h;

или

print "$_ $h{$_}\n" for keys %h;

подойдет, но если у вас есть хеш, заполненный ссылками, вы получите что-то, что может пройтись по этим ссылкам и дать разумный вывод. Эта прогулка по ссылкам обычно называется сериализацией. Есть много модулей, которые реализуют различные стили, некоторые из наиболее популярных из них:

Из-за того, что Data::Dumper является частью базовой библиотеки Perl, она, вероятно, самая популярная; однако некоторые другие модули могут предложить очень хорошие вещи.

10 голосов
/ 22 июля 2009

Мой любимый: Умный :: Комментарии

use Smart::Comments;
# ...

### %hash

Вот и все.

4 голосов
/ 22 июля 2009

Цикличность:

foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }

Функциональное

map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;

Но для чистой элегантности я должен был бы выбрать Wrang-Wrang. Для моего собственного кода я бы выбрал свой foreach. Или использовать самосвал тетро.

2 голосов
/ 22 июля 2009

Самый простой способ в моем опыте - просто использовать Dumpvalue .

use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);

Работает как талисман, и вам не нужно беспокоиться о форматировании хэша, поскольку он выводит его, как это делает отладчик Perl (отлично подходит для отладки). Кроме того, Dumpvalue включен в стандартный набор модулей Perl, поэтому вам не нужно связываться с CPAN, если вы находитесь за каким-то драконовским прокси (как я на работе).

1 голос
/ 18 июля 2017

Мне очень нравится сортировать ключи по одному коду лайнера:

print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);
1 голос
/ 09 апреля 2015

Я добавляю один пробел для каждого элемента хэша, чтобы хорошо видеть:

print map {$_ . " "} %h, "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...