J'ai le résultat d'une variable d'exportation dans Perl comme cette chaîne: Comment puis-je désérialiser ces données dans php? p>
6 Réponses :
use JSON; (or any other data interchange format like XML)JSON documentation and examples are available at CPAN
Si vous pouvez changer le code PERL, alors do comme AMON suggère et utilisez un format de sérialisation standard comme Vous pouvez même Faire de la sortie PERL PHP natif Format de sérialisation si vous le souhaitez vraiment, bien que je ne recommanderais généralement pas cela. (Qu'en est-il de la prochaine fois que vous voulez désorienner les mêmes données dans, disons, python?) P>
Si vous ne peut pas em> changer le code PERL, vous devez juste mordre la balle et essayer d'analyser le Data :: Dumper Sortie en PHP. Je n'ai pas pu trouver de code existant pour le faire, alors on dirait que vous devrez peut-être écrire le vôtre. Cela pourrait être un travail pour un Générateur d'analyseur , bien que le format soit (généralement) assez simple que vous pourriez être capable de simplement la main-la main. p>
Depuis que vous avez déclaré, vous ne pouvez pas changer de format: em> Je n'aime pas utiliser EVAL, mais parce que votre syntaxe est donc em> proche de la syntaxe de tableau PHP attendue, Je pense que nous pouvons le laisser glisser. P> Set Comme il va être un textblock / une grande chaîne, faire: P> Votre résultat est le suivant: p> Note: strong> Je suggérerais que vous preniez maintenant le temps de rénovation et de Mettez à niveau votre contenu de base de données sur un format plus standard simplement pour le fait qu'il sera plus facile de maintenir à l'avenir. P> Vous pouvez faire boucle dans votre base de données, saisissez toute la ligne de contenus à la ligne, à laquelle vous avez Exécutez les données dans la fonction ci-dessus et enveloppez-la dans $ string code> égal au contenu de votre base de données qui correspond au format ci-dessous. Voir ci-dessous pour un exemple de travail à l'aide des données que vous avez fournies. À la fin de la journée, PHP définira la variable au début de votre Perl VaR sur le nouveau tableau analysé. P>
JSON_ENCODE () CODE> et mettez à jour votre ligne de base de données avec la nouvelle chaîne JSON. Cela vous sauvera un mal de tête à l'avenir et vous permettra de mettre à jour toutes vos données pour la nouvelle norme. P> P>
Cela peut générer des résultats surprenants si l'une des chaînes de l'entrée contient des bretelles frisées ou la chaîne Undef code>. (Pour ce dernier, cela pourrait être plus facile et plus sûr de simplement faire
définir ('Undef', null); code> avant le
eval code>.)
(Aussi, êtes-vous vraiment i> devez inclure à la fois une copie de la chaîne d'origine et la sortie print_r code> dans votre réponse? Je vais vous donner un +1 si vous les supprimez .)
Tronqué ce qui précède pour la lisibilité. J'aime ton point sur la définition et c'est une bonne suggestion. Travailler sur une regex maintenant pour corriger le problème où {} code> apparaîtrait dans la chaîne.
Vous pouvez les remplacer avec quelque chose comme "tableau (# {\ n" code> et
") #} \ n" code> puis boucle via la sortie pour annuler le remplacement. (En incluant
{ code> et
} code> dans les remplacements, le codage devrait également être entièrement réversible.)
Je pensais à cela, mais je voulais éviter une deuxième boucle de remplacement, pour des raisons de simplicité et de cognition de code.
-1 pour le eval code> et le fait que cela ressemble plus à un kroup plutôt qu'à une solution.
Comme ce n'est pas JSON, mais cela ressemble à JSON, vous pouvez essayer de modifier une bibliothèque JSON pour travailler avec ce format. J'ai pris ce bibliothèque JSON , remplacée résultat est le suivant: p> est-ce ce que vous cherchez? p> p> : code> avec
=> code> et ajouté
undef code> comme vous pouvez le voir ici (lignes 496, 671 et 681). C'est assez simple, vraiment, et je suppose que vous pouvez travailler autour d'autres différences de manière similaire.
Vous avez un certain nombre de suggestions pour essayer d'analyser une manière ou une autre, mais la vraie question est pourquoi? P>
Pourquoi pas seulement avoir un petit programme PERL qui le charge et épine une chaîne JSON équivalente. P>
Vous pouvez alors appeler ce programme Perl de votre PHP pour faire la conversion; Cela signifie que vous utilisez Perl pour lire le format PERL, ce qui garantirait une conversion correcte. P>
ou (mieux encore) exécutez-le contre toute votre base de données dans un lot, pour vous débarrasser du format de données spécifique à Perl de la DB; Ensuite, vous pouvez simplement utiliser les fonctions JSON standard de PHP. P>
Cela rendrait alors la vie plus simple dans votre code PHP (ou dans toute autre langue dont vous avez besoin pour lire les données à une date ultérieure). P>
C'est la solution évidente et seulement robuste.
Il est également plus sûr que d'utiliser un eval
La solution évidente et seule robuste consiste à utiliser Perl pour désérialiser et résilieriser l'entrée sur un format standard. Le programme PERL qui peut accomplir cette tâche n'a pas besoin d'être très grand, non plus.
// receive input in Perl's Data::Dumper format and produce PHP object output function perl_dd_to_php( $dd_output ) { $process = proc_open( "perl -000 -MJSON -e 'print encode_json eval <>'", array( array("pipe","r"), array("pipe","w") ), $pipes ); fwrite($pipes[0], $dd_output ); fclose($pipes[0]); $json_string = stream_get_contents($pipes[1]); fclose($pipes[1]); return json_decode($json_string); }
Perl n'existe pas
Je serais sérialiser les données à une norme commune, telle que JSON plutôt que quel que soit le format que vous utilisez ( Données :: Dumper Je suppose).
Êtes-vous sûr de dire "sérialiser" et non "désérialisaliser"?
Enregistrement des données dans un format Serialized spécifique à une langue était un mauvais coup. Leçon apprise: utilisez toujours des normes, même lorsque vous ne pensez pas que vous en avez besoin.
Data :: Dumper n'est pas vraiment un bon format de sérialisation.
D'accord avec @bradgilbert - en effet. Data :: Dumper n'est même pas destiné i> à utiliser comme format de sérialisation. (NOR IES'S PHP'S's Print_R () Pour cette affaire, au cas où vous serez jamais tenté)