[Munich-pm] Suche ein noch besserer Data::Dumper :-)

Rouchal, Marek marek.rouchal at intel.com
Mon Jan 23 23:39:36 PST 2012


Hi zusammen,

habe leider auch keine fertige Loesung, aber einen Beitrag, der vielleicht hilfreich ist:
in der OO-Welt gibt es ein "Visitor-Pattern": das setzt voraus, dass jede Klasse eine
"takeVisitor" Methode hat (liesse sich mit UNIVERSAL::takeVisitor machen?). Und
man nehme eine Visitor-Klasse mit einer "visit"-Methode.
Nun uebergibt man dem ersten Objekt, welches man besuchen moechte, dieses
Visitor-Objekt:

package UNIVERSAL;

sub takeVisitor
{
   my ($object, $visitor) = @_;
   $visitor->visit($object);
}

package Visitor;

sub visit
{
    my ($this,$object) = @_;
    ... do something with $object ...
    ... eventually recurse into $object's contents ...
}

package main;

... create $object ...

my $visitor = Visitor->new();
my @result = $object->takeVisitor($visitor);

Die visit-Methode kann nun $object untersuchen, und eine Rekursion in den Inhalt
des Objekts lostreten. Das elegante dabei: $visitor kann nun benutzt werden, um
z.B. verschiedene Strategien zu implementieren (visit_hash, visit_array, visit_scalar,
visit_object) und Konfigurationen zu speichern, a la:
  if($object->isa(...)) { ... } else {...}
um z.B. Objekte einer best. Klasse anders zu behandeln... oder z.B. die Zahl der Keys
zu ermitteln und im Fall von > 20 nur die ersten 5 ausgeben... oder... oder...

Gruss,

Marek

-----Original Message-----
From: munich-pm-bounces+marek.rouchal=intel.com at pm.org [mailto:munich-pm-bounces+marek.rouchal=intel.com at pm.org] On Behalf Of Stephen Riehm
Sent: Friday, January 20, 2012 12:41 AM
To: Perl Mongers, MUC
Subject: [Munich-pm] Suche ein noch besserer Data::Dumper :-)

Hi Jungs,

OK, ihr kennt schon Data::Dumper, YAML, Data::Printer etc. usw. - kenne ich auch... und bin von allen enttäuscht :-) Wir erweitern unser Objekt-Orientierung immer mehr aus - was zu Folge hat, das unser Objekt-Netzwerke immer komplexer werden.
Noch dazu, die Objekte werden immer besser mit einander vernetzt, und das heisst das "mal ein Dump()" auf ein Objekt zum Debuggen leider nicht mehr funktioniert - weil das Ganze Speicher wird ausgegeben.

Was ich suche ist ein Modul, der:
	ein Human-Readable format wie YAML beherrscht (muss nicht wieder geparst werden)
	die gefiltert werden kann (gibt nicht alle keys aus einem Hash aus)
	und noch besser, Objekte die Freiheit geben, sich selbst zu dumpen
	wenn möglich sollte es pur-perl sein und wenige (bis gar keine) Abhängigkeiten mit sich bringen.

Kennt ihr so-was?

Für mich habe ich ein wenig experimentiert und mir einen Modul geschrieben die dies mehr-oder-weniger macht.
Wenn es ein blessed object findet - schaut es nach ob die Methoden dump(), dumpKeyNames(), dumpKeyStyles() oder dumpKeyComments() definiert sind.

dump() gibt das ganze Objekt als mehr-zeilige String zurück - das Objekt kann dabei machen was es will.

dumpKeyNames() gibt einfach eine Liste alle keys die ausgegeben werden darf, und in welchen Reihenfolge (default ist Lexogrphisch).
Wenn andere Keys im Objekt existieren, werde sie nicht gedumpt.

dumpKeyStyles() gibt vor, wie jedes Attribute ausgegeben werden sollte. Der return Wert ist eine Liste key => value Paare.
Der Wert kann entweder 'asString' (ein-Zeilige Representation) und 'dump' um das ganze Objekt aus zu geben (eigentlich, könnte der Wert irgendwelchen Methodennamen sein)

dumpKeyComments() gibt ebenfalls vor, welche Attribute mit eine Kommentar versehen werden sollten. Der return Wert ist ebenfalls eine Liste key => value Paare.
Der Wert wird als Kommentar in der Zeile vor der Key ausgegeben.

Falls eine der Methoden entdeckt wird - dann wird das Objekt entsprechend ausgegeben.

Zum Beispiel, ein Adressbuch, mit Gruppen und natürlich viele Leute.
Eine Gruppe-Objekt trägt eine Liste alle Mitglieder, eine Gruppen Email, vielleicht noch ein Kalendar Objekt usw.
Jeder Person Objekt kann auch mit seine Gruppen verbunden sein usw.

z.B.:

# Beispiel 1:
#       das Person Objekt gibt nur die Namen der verlinkten Gruppen  
aus...
my @people = $address_book->people();
print Dump( \@people );
---
- <Person object>
  name:   Adam
  email:
          # hash-keys in order provided! (and with comments!)
          work: adam at megacorp.com
          home: adam at home.de
          oma:  bub at oma.de
  groups:
          - <Group object> sport freaks
          - <Group object> extreme-couchers
          - <Group object> shatten-parker
- <Person object>
  name:      Frank
  email:
  telephone:
             home:   (089) 123123
             work:   (089) 321 321
  groups:
             - <Group object> shatten-parker
- <Person object>
  name: Joe
...

# Beispiel 2:
#       aber das Group Objekt macht es genau so umgekehrt
#       - hier werden nur die Personen-Namen ausgegeben - statt das  
ganze Objekt
my @tiny_groups = grep { scalar( $_->members() ) < 10 } $address_book-  >groups(); print Dump( \@tiny_groups );
---
- <Group object>
  name: schatten-parker
  email:
    group:  extrem-schatten at parkhaus.de
  # note that the Person objects are only displayed as 'name'
  members:
    - <Person object> Adam
    - <Person object> Frank
...

Habt ihr irgendwelchen Ideen?

Steve
_______________________________________________
Munich-pm mailing list http://munich.pm.org/ Munich-pm at pm.org http://mail.pm.org/mailman/listinfo/munich-pm


More information about the Munich-pm mailing list