Komplexe Datenstrukturen mit Dumpvalue darstellen
Veröffentlicht von Thomas Fahle am (Permalink)
Smarte Datenstrukturen und dummer Code funktionieren viel besser als umgekehrt
Brooks, Kapitel 9: "Also zeige mir Deinen [Code], aber verhülle Deine [Datenstrukturen], und ich werde auf ewig im Dunkeln tappen. Zeige mir aber Deine [Datenstrukturen] und ich werde Deinen [Code] gar nicht brauchen, denn ich weiß, wie er aussieht." (Quelle: Die Kathedrale und der Basar.)
Smarte Datenstrukturen sind manchmal auch komplex. Hier hilft das Standardmodul Dumpvalue, das die übersichtliche Darstellung komplexer Datenstrukturen unterstützt. Die für diesen Zweck häufig verwendeten CPAN-Module Data::Dumper und Data::Dump::Streamer sind eigentlich zur Serialisierung von Datenstrukturen entwickelt worden und weniger zur Darstellung.
Dieser Beitrag geht auf folgende häufig anzutreffende Datenstrukturen ein
- Arrays of Arrays
- Hashes of Arrays
- Arrays of Hashes
- Hashes of Hashes
- Hash mit komplexer Datenstruktur
und zeigt wie Dumpvalue diese darstellt.
dumpvalue()
Die Methode dumpvalue() aus dem Paket Dumpvalue, erwartet als Parameter eine Referenz (\) auf eine Datenstruktur und gibt eine Darstellung der Datenstruktur im Listenkontext zurück.
Gibt man dumpvalue() jedoch eine Referenz auf eine Referenz (\\) auf eine Datenstruktur als Parameter, so wird die Ausgabe wesentlich informativer. In diesem Fall wird das Ausgabeformat des Perl-Debuggers verwendet.
Im Abschnitt Arrays of Arrays werden beide Formen kurz dargestellt. In den weiteren Abschnitten wird durchgehend die zweite Form (\\) verwendet.
Arrays of Arrays
#!/usr/bin/perl use strict; use warnings; use Dumpvalue; my $dumper = new Dumpvalue; my @AoA = ( [ "fred", "barney" ], [ "george", "jane", "elroy" ], [ "homer", "marge", "bart" ], ); $dumper->dumpValue(\@AoA);
Das Programm erzeugt folgende Ausgabe:
0 ARRAY(0x8153c28) 0 'fred' 1 'barney' 1 ARRAY(0x8190814) 0 'george' 1 'jane' 2 'elroy' 2 ARRAY(0x81953f0) 0 'homer' 1 'marge' 2 'bart'
Verwendet man zwei Backslashes (\\), werden mehr Details angezeigt.
$dumper->dumpValue(\\@AoA);
Das Programm erzeugt jetzt folgende Ausgabe:
-> ARRAY(0x8154630) 0 ARRAY(0x8153c28) 0 'fred' 1 'barney' 1 ARRAY(0x8190814) 0 'george' 1 'jane' 2 'elroy' 2 ARRAY(0x81953f0) 0 'homer' 1 'marge' 2 'bart'
Hashes of Arrays
#!/usr/bin/perl use strict; use warnings; use Dumpvalue; my $dumper = new Dumpvalue; my %HoA = ( flintstones => [ "fred", "barney" ], jetsons => [ "george", "jane", "elroy" ], simpsons => [ "homer", "marge", "bart" ], ); $dumper->dumpValue(\\%HoA);
Das Programm erzeugt folgende Ausgabe:
-> HASH(0x8154630) 'flintstones' => ARRAY(0x8153c28) 0 'fred' 1 'barney' 'jetsons' => ARRAY(0x8190880) 0 'george' 1 'jane' 2 'elroy' 'simpsons' => ARRAY(0x819545c) 0 'homer' 1 'marge' 2 'bart'
Arrays of Hashes
#!/usr/bin/perl use strict; use warnings; use Dumpvalue; my $dumper = new Dumpvalue; my @AoH = ( { Lead => "fred", Friend => "barney", }, { Lead => "george", Wife => "jane", Son => "elroy", }, { Lead => "homer", Wife => "marge", Son => "bart", }, ); $dumper->dumpValue(\\@AoH);
Das Programm erzeugt folgende Ausgabe:
-> ARRAY(0x8154630) 0 HASH(0x8153c28) 'Friend' => 'barney' 'Lead' => 'fred' 1 HASH(0x81954ec) 'Lead' => 'george' 'Son' => 'elroy' 'Wife' => 'jane' 2 HASH(0x8195534) 'Lead' => 'homer' 'Son' => 'bart' 'Wife' => 'marge'
Hashes of Hashes
#!/usr/bin/perl use strict; use warnings; use Dumpvalue; my $dumper = new Dumpvalue; my %HoH = ( flintstones => { lead => "fred", pal => "barney", }, jetsons => { lead => "george", wife => "jane", "his boy" => "elroy", }, simpsons => { lead => "homer", wife => "marge", kid => "bart", }, ); $dumper->dumpValue(\\%HoH);
Das Programm erzeugt folgende Ausgabe:
-> HASH(0x8154630) 'flintstones' => HASH(0x8153c28) 'lead' => 'fred' 'pal' => 'barney' 'jetsons' => HASH(0x81954fc) 'his boy' => 'elroy' 'lead' => 'george' 'wife' => 'jane' 'simpsons' => HASH(0x819552c) 'kid' => 'bart' 'lead' => 'homer' 'wife' => 'marge'
Hash mit komplexer Datenstruktur
#!/usr/bin/perl use strict; use warnings; use Dumpvalue; my $dumper = new Dumpvalue; my %TV = ( flintstones => { series => "flintstones", nights => [ qw(monday thursday friday) ], members => [ { name => "fred", role => "lead", age => 36, }, { name => "wilma", role => "wife", age => 31, }, { name => "pebbles", role => "kid", age => 4, }, ], }, jetsons => { series => "jetsons", nights => [ qw(wednesday saturday) ], members => [ { name => "george", role => "lead", age => 41, }, { name => "jane", role => "wife", age => 39, }, { name => "elroy", role => "kid", age => 9, }, ], }, simpsons => { series => "simpsons", nights => [ qw(monday) ], members => [ { name => "homer", role => "lead", age => 34, }, { name => "marge", role => "wife", age => 37, }, { name => "bart", role => "kid", age => 11, }, ], }, ); $dumper->dumpValue(\\%TV);
Das Programm erzeugt folgende Ausgabe:
-> HASH(0x8154630) 'flintstones' => HASH(0x81d49d4) 'members' => ARRAY(0x81d4998) 0 HASH(0x81d4824) 'age' => 36 'name' => 'fred' 'role' => 'lead' 1 HASH(0x81d4860) 'age' => 31 'name' => 'wilma' 'role' => 'wife' 2 HASH(0x81d495c) 'age' => 4 'name' => 'pebbles' 'role' => 'kid' 'nights' => ARRAY(0x8153c28) 0 'monday' 1 'thursday' 2 'friday' 'series' => 'flintstones' 'jetsons' => HASH(0x81d4b30) 'members' => ARRAY(0x81d4af4) 0 HASH(0x81d4a40) 'age' => 41 'name' => 'george' 'role' => 'lead' 1 HASH(0x81d4a7c) 'age' => 39 'name' => 'jane' 'role' => 'wife' 2 HASH(0x81d4ab8) 'age' => 9 'name' => 'elroy' 'role' => 'kid' 'nights' => ARRAY(0x81d4a10) 0 'wednesday' 1 'saturday' 'series' => 'jetsons' 'simpsons' => HASH(0x81d4c80) 'members' => ARRAY(0x81d4c44) 0 HASH(0x81d4b90) 'age' => 34 'name' => 'homer' 'role' => 'lead' 1 HASH(0x81d4bcc) 'age' => 37 'name' => 'marge' 'role' => 'wife' 2 HASH(0x81d4c08) 'age' => 11 'name' => 'bart' 'role' => 'kid' 'nights' => ARRAY(0x81d4b6c) 0 'monday' 'series' => 'simpsons'