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

135

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

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

Теги:
printing
hash

11 ответов

202

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

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

выводит

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };
  • 0
    Не могли бы вы добавить результат этого кода?
  • 3
    оригинальный постер может также захотеть изучить различные опции Data :: Dumper, в частности, включение 'Sortkeys' может быть очень полезным
Показать ещё 4 комментария
48

Просто:

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

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

while (my ($k,$v)=each %h){print "$k $v\n"}
  • 9
    Слизняк: выведите «@_ \ n», а @_ = каждый% h
  • 0
    Я думаю, что вы имеете в виду print "$_ $h{$_}\n" for (keys %h); в этом примере $k не существует.
Показать ещё 3 комментария
26

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

print "@{[%hash]}";
19

В целях отладки я часто использую 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"
    }
}
  • 0
    иметь аккуратные цвета, но я делаю что-то не так или использую «use Data :: Printer; p% var;» не печатает стрелки в хешах, и для новичка, как я, это помогает
  • 0
    @Sosi Если вы посмотрите на вывод в ответе, вы увидите, что он не выводит => как вы ожидаете. Вместо этого он всегда печатает ключ, несколько пробелов, а затем значение. Что помогает человеку сканировать вывод.
11

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

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

или

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

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

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

11

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

use Smart::Comments;
# ...

### %hash

Что это.

  • 0
    Это круто. +1
  • 5
    Извините, но я голосую за материал, который перехватывает комментарии для реальной функциональности. Программист обслуживания мог потратить весь день, пытаясь понять, почему такой код печатает неожиданные вещи.
Показать ещё 2 комментария
4

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

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

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

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

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

  • 3
    Нет никакой функциональной разницы между использованием foreach и map . map должна использоваться для преобразования списка, а не в пустом контексте для эмуляции цикла for
  • 0
    Было бы интересно увидеть результаты каждого из «байт-кода» ... Интересно, является ли карта более или менее эффективной.
2

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

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

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

1

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

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

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

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

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

  • 0
    ОП говорит, что у него есть «мой хэш», который нужно распечатать. Этот ответ просто ум ради самого себя
  • 0
    ОП надеялся сделать это в одну строку. Просто показывал однострочный способ сделать это. Так что это достойно отрицательного голоса?
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню