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.
Python Dictionary als Perl Hash serialisieren
@nezzcarth: Ich würde ja etwas sprachunabhängiges wählen. JSON zum Beispiel. Dafür gibt es auch für Perl Module.
Wo ist das Problem, eine in Perl geschriebene Zwischeninstanz einzubauen, die das JSON vor Übergabe an das Perl-Programm entsprechend konvertiert?nezzcarth hat geschrieben:allerdings versuche ich Daten für ein Programm zu erzeugen, das dieses Format erwartet.
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?
@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.
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.
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
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.
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}]'
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.
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.LanX hat geschrieben: Viele Dumper erlauben es die Trenner selbst zu konfigurieren, und ein etwas googlen zeigt das auch für Python
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...)
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...nezzcarth hat geschrieben:Allerdings könnte was mit 'JSONEncoder'/JSONDecoder' möglich sein...
Ü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.
Wie gesagt viele Dumper erlauben dies, nicht nur JSON, es geht letztendlich darum die Formatierung zu justieren.nezzcarth hat geschrieben: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)LanX hat geschrieben: Viele Dumper erlauben es die Trenner selbst zu konfigurieren, und ein etwas googlen zeigt das auch für Python
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.
por ejemplo: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.
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
};
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.
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.