Я продолжаю печатать свой хэш в виде # выделенных ведер /#. Как распечатать содержимое моего хэша?
Без использования цикла while
было бы наиболее предпочтительным (например, лучше было бы one-liner).
Я продолжаю печатать свой хэш в виде # выделенных ведер /#. Как распечатать содержимое моего хэша?
Без использования цикла while
было бы наиболее предпочтительным (например, лучше было бы one-liner).
Данные:: Dumper - ваш друг.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
выводит
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
Просто:
print "$_ $h{$_}\n" for (keys %h);
Элегантный, но на самом деле на 30% медленнее (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
Здесь вы можете печатать без использования Data:: Dumper
print "@{[%hash]}";
В целях отладки я часто использую 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"
}
}
Мой любимый: Smart::Comments
use Smart::Comments;
# ...
### %hash
Что это.
Ответ зависит от того, что находится в вашем хеше. Если у вас простой хэш, просто
print map { "$_ $h{$_}\n" } keys %h;
или
print "$_ $h{$_}\n" for keys %h;
но если у вас есть хеш, который заполнен ссылками, вы будете что-то, что сможет пройти эти ссылки и получить разумный результат. Эта ходьба ссылок обычно называется сериализацией. Существует множество модулей, которые реализуют разные стили, некоторые из наиболее популярных:
В связи с тем, что Data::Dumper
является частью основной библиотеки Perl, это, вероятно, самый популярный; однако некоторые из других модулей имеют очень хорошие возможности.
Цикличность:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Функциональные
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Но для чистой элегантности мне нужно было бы выбрать wrang-wrang's. Для моего собственного кода я выбрал бы свой foreach. Или использование тетроупаса.
Самый простой способ в моем опыте - просто использовать Dumpvalue.
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Работает как шарм, и вам не нужно беспокоиться о форматировании хэша, поскольку он выводит его, как это делает отладчик Perl (отлично подходит для отладки). Кроме того, Dumpvalue входит в комплект набора модулей Perl, поэтому вам не нужно возиться с CPAN, если вы находитесь за каким-то драконовским прокси (например, я на работе).
Если вы хотите быть педантичным и держать его в одной строке (без использования утверждений и shebang), то я буду отвлекаться от ответа tetromino и предложить:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Не делать ничего особенного, кроме использования анонимного хеша, чтобы пропустить временную переменную;)
Я добавляю одно пространство для каждого элемента хэша, чтобы хорошо его видеть:
print map {$_ . " "} %h, "\n";
Мне очень нравится сортировать ключи в одном коде liner:
print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);