Как распечатать содержимое хэша в Perl?

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

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

Ответ 1

Данные:: Dumper - ваш друг.

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

выводит

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };

Ответ 2

Просто:

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

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

while (my ($k,$v)=each %h){print "$k $v\n"}

Ответ 3

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

print "@{[%hash]}";

Ответ 4

В целях отладки я часто использую 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"
    }
}

Ответ 5

Мой любимый: Smart::Comments

use Smart::Comments;
# ...

### %hash

Что это.

Ответ 6

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

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

или

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

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

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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

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

Ответ 9

Если вы хотите быть педантичным и держать его в одной строке (без использования утверждений и shebang), то я буду отвлекаться от ответа tetromino и предложить:

print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );

Не делать ничего особенного, кроме использования анонимного хеша, чтобы пропустить временную переменную;)

Ответ 10

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

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

Ответ 11

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

print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);