Komplexe Datenstrukturen mit Dumpvalue darstellen

| | Kommentare (0)

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'

Siehe auch

Jetzt kommentieren

Über diese Seite

Diese Seite enthält einen einen einzelnen Eintrag von Thomas Fahle vom 25.06.08 20:00.

Shell-Aliase effektiv nutzen ist der vorherige Eintrag in diesem Blog.

Dateien rückwärts lesen ist der nächste Eintrag in diesem Blog.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.