Как распечатать хеш в Perl

В языке программирования Perl иногда возникает необходимость распечатать содержимое хеша.

Например, есть хеш %h со следующим содержимым:

my %h = (
    John => 'red',
    Alice => 'silver',
    Bob => 'yellow',
);

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

Использование Data::Dumper

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

Вот пример кода:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my %h = (
    John => 'red',
    Alice => 'silver',
    Bob => 'yellow',
);

print Dumper \%h;

Вот что выведет эта программа:

$VAR1 = {
          'Bob' => 'yellow',
          'Alice' => 'silver',
          'John' => 'red'
        };

Хеш хранит в себе не упорядоченные пары значений. Разные запуск программы будет выводить пары в разном порядке.

Использование print

А что будет если просто передать хеш в print?

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my %h = (
    John => 'red',
    Alice => 'silver',
    Bob => 'yellow',
);

print %h;

Программа выведет одну строчку вида:

JohnredBobyellowAlicesilver

Видно что в этом случае print вывел на экран слитно все пары ключ-значение из хеша. Хеш хранит в себе не упорядоченные пары значений. Разные запуски программы будут выдавать разный вывод.

print и переменная $,

Если просто указать print %h;, то это распечатает все пары ключ-значение слитно. Можно попросить perl вставлять какой-то символ между элементами. Например, символ новой строки \n.

Для этого нужно поместить этот символ в специальную переменную $,. Вот код:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my %h = (
    John => 'red',
    Alice => 'silver',
    Bob => 'yellow',
);

$, = "\n";

print %h;

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

Bob
yellow
Alice
silver
John
red

Но этот способ нужно использовать аккуратно. Переменная $, — глобальная. Если вы ее меняете, то она меняется для всей программы. В некоторых ситуациях имеет смысл либо вообще не использовать такой способ, либо сохранить значение этой переменной во временную переменную, а после print вернуть в нее значение, например, таким образом:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my %h = (
    John => 'red',
    Alice => 'silver',
    Bob => 'yellow',
);

my $saved = $,;

$, = "\n";

print %h;

$, = $saved;

Итерирование по хешу

Наиболее мощный и гибкий способ как вывести содержимое хеша на экран — это пройти по всем значениям в хеше и вывести из на экран в том виде как нужно. Вот один из примеров как это можно сделать:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

my %h = (
    John => 'red',
    Alice => 'silver',
    Bob => 'yellow',
);

foreach my $name (sort keys %h) {
    say "$name $h{$name}";
}

Вывод программы всегда один и тот же:

Alice silver
Bob yellow
John red

Для пар значений в хеше порядок неопределен, но в этом программе используется sort для того чтобы вывести ключи в алфавитном порядке.

Связанные темы

Другие статьи