Я продолжаю печатать свой хэш как количество выделенных сегментов. Как мне распечатать содержимое моего хэша?
Без использования while
цикла было бы наиболее предпочтительным (например, однострочник будет лучше).
Я продолжаю печатать свой хэш как количество выделенных сегментов. Как мне распечатать содержимое моего хэша?
Без использования while
цикла было бы наиболее предпочтительным (например, однострочник будет лучше).
Ответы:
Data :: Dumper - твой друг
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
будет выводить
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
операторы в C и C ++. Причина, по которой это имеет значение в этом контексте, заключается в том, что в Perl, если вы вызываете функцию со значением хеш-функции в качестве аргумента, это значение хеш-функции будет распечатано и разбито на несколько аргументов - так %hsh=("a" => 1, "b" => 2); foo(%hsh);
что будет эквивалентно foo("a", 1, "b", 2)
. Если вы хотите, чтобы функция работала с самим хэшем, вам нужно передать ссылку на хеш: foo(\%hsh);
См. Perldoc.perl.org/perlsub.html#Pass-by-Reference
Легко:
print "$_ $h{$_}\n" for (keys %h);
Элегантно, но на самом деле на 30% медленнее (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
не существует в этом примере.
for
Цикл быстрее , чем while
до , по меньшей мере 10000 ключей: gist.github.com/151792
Вот как вы можете печатать без использования 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"
}
}
=>
что вы ожидаете. Вместо этого он всегда печатает ключ, несколько пробелов, а затем значение. Что помогает человеку сканировать вывод.
Ответ зависит от того, что находится в вашем хеше. Если у вас есть простой хэш простой
print map { "$_ $h{$_}\n" } keys %h;
или
print "$_ $h{$_}\n" for keys %h;
будет делать, но если у вас есть хеш, заполненный ссылками, вы получите что-то, что может пройтись по этим ссылкам и дать разумный вывод. Эта прогулка по ссылкам обычно называется сериализацией. Есть много модулей, которые реализуют различные стили, некоторые из наиболее популярных:
Из-за того, что Data::Dumper
является частью базовой библиотеки Perl, она, вероятно, самая популярная; Тем не менее, некоторые другие модули могут предложить очень хорошие вещи.
use
Smart::Comments
, я не вижу его с этой точки зрения. Но для счетчика, Smart::Comments
он довольно хорошо ведет себя как модуль с областью видимости , не должно быть выходного поведения в любом модуле, который также не использует SC. Таким образом, проблема будет изолирована для этих областей с помощью оператора использования . Если вы говорите, что программист по техническому обслуживанию не несет ответственности за чтение документации по включенным модулям, я не могу согласиться. Тем не менее, спасибо за комментарий
Циклический:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
функциональная
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Но для чистой элегантности я должен был бы выбрать Wrang-Wrang. Для моего собственного кода я бы выбрал свой foreach. Или использовать самосвал тетро.
foreach
и map
. map
должен использоваться для преобразования списка, а не в пустом контексте для эмуляции цикла for
Самый простой способ в моем опыте - просто использовать Dumpvalue .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Работает как шарм, и вам не нужно беспокоиться о форматировании хэша, поскольку он выводит его, как это делает отладчик Perl (отлично подходит для отладки). Кроме того, Dumpvalue включен в стандартный набор модулей Perl, так что вам не придется связываться с CPAN, если вы находитесь за каким-то драконовским прокси (как я на работе).
Если вы хотите быть педантичным и держать его в одной строке (без использования операторов и шебанга), тогда я как бы отброслю ответ Тетромино и предложу:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Не делать ничего особенного, кроме использования анонимного хеша для пропуска временной переменной;)