В языке программирования Perl иногда возникает необходимость распечатать содержимое хеша.
В языке программирования Perl иногда возникает необходимость распечатать содержимое хеша.
Например, есть хеш %h
со следующим содержимым:
my %h = (
John => 'red',
Alice => 'silver',
Bob => 'yellow',
);
В зависимости от того что требуется, есть несколько разных способов как можно распечатать хеш.
Data::Dumper
В том случае если нужно быстро посмотреть что содержится в хеше, то для этого
удобно использовать модуль Data::Dumper
. Это может пригодиться
в процессе разработки или отладки программы.
Вот пример кода:
#!/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
?
#!/usr/bin/perl
use strict;
use warnings;
my %h = (
John => 'red',
Alice => 'silver',
Bob => 'yellow',
);
print %h;
Программа выведет одну строчку вида:
JohnredBobyellowAlicesilver
Видно что в этом случае print
вывел на экран слитно все пары ключ-значение из хеша.
Хеш хранит в себе не упорядоченные пары значений. Разные запуски программы будут выдавать разный вывод.
print
и переменная $,
Если просто указать print %h;
, то это распечатает все пары ключ-значение слитно.
Можно попросить perl вставлять какой-то символ между элементами. Например,
символ новой строки \n
.
Для этого нужно поместить этот символ в специальную переменную $,
. Вот код:
#!/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
вернуть в нее значение,
например, таким образом:
#!/usr/bin/perl
use strict;
use warnings;
my %h = (
John => 'red',
Alice => 'silver',
Bob => 'yellow',
);
my $saved = $,;
$, = "\n";
print %h;
$, = $saved;
Наиболее мощный и гибкий способ как вывести содержимое хеша на экран — это пройти по всем значениям в хеше и вывести из на экран в том виде как нужно. Вот один из примеров как это можно сделать:
#!/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
для того
чтобы вывести ключи в алфавитном порядке.