[Munich-pm] Suche ein noch besserer Data::Dumper :-)
Stephen Riehm
japh at opensauce.de
Thu Jan 19 15:40:55 PST 2012
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
More information about the Munich-pm
mailing list