Python Dictionary als Perl Hash serialisieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Hallo :)

kennt jemand eine praktikable und stabile Methode, mit der ich Python-Dictionaries in eine String-Repräsentation überführen kann, die ein valider Perl-Hash wäre? Gibt es da (unwahrscheinlicherweise) evtl. schon etwas fertiges? Eigentlich würde ich ungerne selbst entsprechende Strings zusammenbauen...

Bin für jeden Hinweis sehr dankbar.
BlackJack

@nezzcarth: Ich würde ja etwas sprachunabhängiges wählen. JSON zum Beispiel. Dafür gibt es auch für Perl Module.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

@BlackJack: Ja, ich eigentlich auch, allerdings versuche ich Daten für ein Programm zu erzeugen, das dieses Format erwartet.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

nezzcarth hat geschrieben:allerdings versuche ich Daten für ein Programm zu erzeugen, das dieses Format erwartet.
Wo ist das Problem, eine in Perl geschriebene Zwischeninstanz einzubauen, die das JSON vor Übergabe an das Perl-Programm entsprechend konvertiert?

Es gibt Python->JSON und es gibt JSON->Perl. JSON lässt sich sehr gut als Bindeglied für die Datenübertragung zwischen unterschiedlichen Programmiersprachen verwenden. Warum willst du dieses Szenario durch eine eigene – vermutlich fehlerbehaftete – Lösung, die deutlich aufwändiger wäre, umgehen?
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

@snafu:
Dass das, was ich da vorhabe, etwas krude und nach unsauberer Programmierung/Architektur klingt, ist mir schon durchaus bewusst ;) Allerdings hat der Ansatz, den du vorschlägst und den ich auch schon mal kurz angedacht hatte, für den konkreten Anwendungsfall diverse Nachteile. Im Zweifelsfall würde ich es wohl so machen, aber eine einfache Möglichkeit, die Daten aus Python direkt so zu serialisieren, wäre das schon besser.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

Ich verstehe eigentlich nicht viel von Python, aber wenn schon nach Perl gefragt ist ... ;-)

Viele Dumper erlauben es die Trenner selbst zu konfigurieren, und ein etwas googlen zeigt das auch für Python

Code: Alles auswählen

>>> import json
>>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', '=>'))
'[1,2,3,{"4"=>5,"6"=>7}]'
Perl ist ziemlich DWIM, mir fällt auf Anhieb kein Fall ein wo das schief gehen könnte.


Obwohl, sicherheitshalber würde ich schauen ob du single statt doublequotes für Strings konfigurieren kannst, um jegliche Variableninterpolation auszuschließen...

Gruß
Rolf

Nachtrag:

Grundsätzlich ist natürlich der oben vorgeschlagene Vorschlag JSON als Zwischenformat zu nehmen vorzuziehen.

Der Teufel liegt im Detail, aber solange es sich nur um Strings und Zahlen handelt und das Zielformat von vornherein Perl Datentypen sind, solltest du das ganz gut im Griff bekommen können.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

LanX hat geschrieben: Viele Dumper erlauben es die Trenner selbst zu konfigurieren, und ein etwas googlen zeigt das auch für Python
Danke für den Hinweis. Nach dieser Möglichkeit habe ich ehrlich gesagt gar nicht gesucht, weil ich auf die Idee nicht gekommen bin, dass so etwas in einem JSON-Modul konfigurierbar sein könnte (denn das Resultat ist kein valides JSON mehr); load und loads kennen den Parameter (daher?) auch nicht.
Allerdings könnte was mit 'JSONEncoder'/JSONDecoder' möglich sein...

(Und mir ist wie gesagt schon klar, dass 'richtiges' JSON hier die bessere Wahl wäre...)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

nezzcarth hat geschrieben:Allerdings könnte was mit 'JSONEncoder'/JSONDecoder' möglich sein...
Aber dann benutzt du letztlich ja doch wieder Teile der JSON-Bibliothek, um dieses "perlige" JSON zu verarbeiten. Warum dann nicht von Anfang an valides JSON übertragen und verarbeiten? Nichts für ungut, aber das ist so ziemlich von hinten durch die Brust ins Auge...

Übrigens denke ich, dass dein Tippgeber mit seiner Quick&Dirty-Lösung eigentlich davon ausging, dass du das Resultat nach der Übertragung direkt von Perl interpretieren lässt. Oftmals gibt es einen Aufruf, der "exec" oder ähnlich heißt, mit dem man Strings von der jeweiligen Sprache interpretieren lassen kann.

EDIT: eval scheint das zu können. Aber ob du jetzt "eval" oder etwas aus der JSON-API aufrufst, kommt vom Auwand her auf's selbe heraus. Nur dass JSON eben sauberer, sicherer und viel gängiger ist.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

nezzcarth hat geschrieben:
LanX hat geschrieben: Viele Dumper erlauben es die Trenner selbst zu konfigurieren, und ein etwas googlen zeigt das auch für Python
Danke für den Hinweis. Nach dieser Möglichkeit habe ich ehrlich gesagt gar nicht gesucht, weil ich auf die Idee nicht gekommen bin, dass so etwas in einem JSON-Modul konfigurierbar sein könnte (denn das Resultat ist kein valides JSON mehr)
Wie gesagt viele Dumper erlauben dies, nicht nur JSON, es geht letztendlich darum die Formatierung zu justieren.

Die doublequotes bereiten mir hier aber wie gesagt Bauchschmerzen, schau dich mal nach Python dumper um, die dürften singlequotes vorziehen. (Perl braucht Quotes meistens gar nicht)

Grundsätzlich würde es helfen zu wissen wie das Resultat aussehen soll... (Beispiel? )

Ich kann mir Fälle vorstellen wo der Zwischenschritt über JSON mehr Ärger macht.

Du kannst auch aus Python einen Perl Einzeiler aufrufen, wo du JSON (oder YAML oder...) über STDIN reinpipest und Perl ein Hash auf STDOUT (mittels Data::Dumper ) ausgibt. So brauchst du nicht das eigentliche Zielprogram anzupassen.
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

LanX hat geschrieben:Du kannst auch aus Python einen Perl Einzeiler aufrufen, wo du JSON (oder YAML oder...) über STDIN reinpipest und Perl ein Hash auf STDOUT (mittels Data::Dumper ) ausgibt. So brauchst du nicht das eigentliche Zielprogram anzupassen.
por ejemplo:

Code: Alles auswählen

$ echo '{"a":1,"b":2}' | perl -e 'use JSON::PP; use Data::Dumper; print Dumper decode_json <>'
$VAR1 = {
          'a' => 1,
          'b' => 2
        };
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

Ich muss noch mal hinterher schicken das es keine allgemeingültige Lösung hierfür gibt.

Python und Perl haben unterschiedliche Datentypen und JS resp JSON macht es noch komplexer.


Es kommt also sehr darauf an was man erreichen will und welche Datentypen wie gemapt werden sollen.
Antworten