Я продовжую друкувати свій хеш як # відра / # виділено. Як надрукувати вміст мого хеша?
Без використання while
циклу буде найкращим (наприклад, один лайнер буде краще).
Я продовжую друкувати свій хеш як # відра / # виділено. Як надрукувати вміст мого хеша?
Без використання while
циклу буде найкращим (наприклад, один лайнер буде краще).
Відповіді:
Дані :: Дампер - твій друг.
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. Для власного коду я вибрав би свій передчуття. Або використання Dumper від tetro.
foreach
та map
. map
слід використовувати для перетворень списку, а не в недійсному контексті для імітації for-loop
Найпростіший спосіб з мого досвіду - просто використовувати 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] } );
Не робити нічого іншого, крім використання анонімного хешу для пропуску змінної temp;)