Nadal drukuję mój hash jako # segmentów / # przydzielonych. Jak wydrukować zawartość mojego skrótu?
while
Najlepiej byłoby bez pętli (na przykład jednowarstwowy byłby najlepszy).
Nadal drukuję mój hash jako # segmentów / # przydzielonych. Jak wydrukować zawartość mojego skrótu?
while
Najlepiej byłoby bez pętli (na przykład jednowarstwowy byłby najlepszy).
Odpowiedzi:
Data :: Dumper to twój przyjaciel.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
wyjdzie
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
operator w C i C ++. Powodem, dla którego ma to znaczenie w tym kontekście jest to, że w Perlu, jeśli wywołasz funkcję z wartością skrótu jako argumentem, ta wartość skrótu zostanie wyświetlona i rozszerzona na wiele argumentów - więc %hsh=("a" => 1, "b" => 2); foo(%hsh);
będzie to równoważne foo("a", 1, "b", 2)
. Jeśli zamiast tego chcesz, aby funkcja działała na samym skrócie , musisz przekazać odniesienie do skrótu: foo(\%hsh);
Zobacz perldoc.perl.org/perlsub.html#Pass-by-Reference
Łatwo:
print "$_ $h{$_}\n" for (keys %h);
Eleganckie, ale w rzeczywistości o 30% wolniejsze (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
że nie istnieje w tym przykładzie.
for
Pętla jest większa niż while
do co najmniej 10000 klawiszy: gist.github.com/151792
Tutaj możesz drukować bez użycia Data::Dumper
print "@{[%hash]}";
Do celów debugowania będę często używać YAML
.
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
Prowadzi do:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
Innym razem użyję Data::Dump
. Nie musisz ustawiać tylu zmiennych, aby wyświetlić je w ładnym formacie niż w przypadku Data::Dumper
.
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
Niedawno Data::Printer
używałem do debugowania.
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(Wynik może być znacznie bardziej kolorowy na terminalu)
W przeciwieństwie do innych przykładów, które tutaj pokazałem, ten jest przeznaczony wyłącznie do wyświetlania. Co pojawia się łatwiej, jeśli wyrzucisz strukturę zmiennej powiązanej lub obiektu.
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"
}
}
=>
tak, jak oczekujesz. Zamiast tego zawsze wypisuje klucz, kilka spacji, a następnie wartość. Co pomaga człowiekowi skanować dane wyjściowe.
Odpowiedź zależy od tego, co jest w twoim hashu. Jeśli masz prosty skrót, plik simple
print map { "$_ $h{$_}\n" } keys %h;
lub
print "$_ $h{$_}\n" for keys %h;
wystarczy, ale jeśli masz hash, który jest wypełniony referencjami, znajdziesz coś, co może przejrzeć te odwołania i wygenerować rozsądny wynik. To chodzenie po odniesieniach jest zwykle nazywane serializacją. Istnieje wiele modułów, które implementują różne style, niektóre z bardziej popularnych to:
Ze względu na to, że Data::Dumper
jest częścią podstawowej biblioteki Perla, jest prawdopodobnie najpopularniejszą; jednak niektóre inne moduły oferują bardzo dobre rzeczy.
use
Smart::Comments
, widzę to również z tej perspektywy. Ale licznik Smart::Comments
zachowuje się całkiem dobrze jako moduł o określonym zakresie , nie powinno być zachowania wyjścia w żadnym module, który również nie używa SC. Tak więc problem byłby izolowany do tych zakresów za pomocą instrukcji użycia . Jeśli mówisz, że programista konserwacyjny nie ma obowiązku czytać dokumentacji dotyczącej dołączonych modułów, nie mogę się z tym zgodzić. Mimo to dziękuję za komentarz
Pętla:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Funkcjonalny
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Ale ze względu na czystą elegancję musiałbym wybrać wrang-wrang. Jako własny kod wybrałbym moje foreach. Lub użycie Dumpera Tetro.
foreach
i map
. map
powinny być wykorzystywane do listy przemian, a nie w kontekście void aby emulować dla pętli
Z moich doświadczeń wynika, że najłatwiej jest po prostu użyć Dumpvalue .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Działa jak urok i nie musisz się martwić o formatowanie skrótu, ponieważ wyświetla go tak, jak robi to debugger Perla (świetne do debugowania). Ponadto Dumpvalue jest dołączony do podstawowego zestawu modułów Perla, więc nie musisz zadzierać z CPAN, jeśli stoisz za jakimś drakońskim proxy (tak jak ja w pracy).
Jeśli chcesz być pedantyczny i trzymać go w jednej linii (bez instrukcji użycia i huku), to trochę wycofam się z odpowiedzi tetromino i zasugeruję:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Nie robię nic specjalnego poza używaniem anonimowego hasha do pominięcia zmiennej tymczasowej;)