[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