6
votes

Comment désérialiser les données Perl :: sortie dumbre en PHP

J'ai le résultat d'une variable d'exportation dans Perl comme cette chaîne: xxx

Comment puis-je désérialiser ces données dans php?

P.S. J'ai déjà des données dans ce format dans dB, je ne peux pas le changer à JSON ou à une autre.


6 commentaires

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é à utiliser comme format de sérialisation. (NOR IES'S PHP'S's Print_R () Pour cette affaire, au cas où vous serez jamais tenté)


6 Réponses :


1
votes
use JSON;
(or any other data interchange format like XML)JSON documentation and examples are available at CPAN

0 commentaires

1
votes

Si vous pouvez changer le code PERL, alors do comme AMON suggère et utilisez un format de sérialisation standard comme JSON ou XML ou Yaml que vous pouvez désérialiser dans php.

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?)

Si vous ne peut pas 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.


EDIT: Depuis que vous dites que vous avez ces données sérialisées dans une base de données, pourquoi pas simplement écrire un programme perl pour lire les données et la convertir à une norme plus standard format de sérialisation comme JSON?


0 commentaires

0
votes

Depuis que vous avez déclaré, vous ne pouvez pas changer de format:

Je n'aime pas utiliser EVAL, mais parce que votre syntaxe est donc proche de la syntaxe de tableau PHP attendue, Je pense que nous pouvons le laisser glisser.

Set $ string é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é.

Comme il va être un textblock / une grande chaîne, faire: xxx

Votre résultat est le suivant: xxx

Note: 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.

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 JSON_ENCODE () 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.


6 commentaires

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 . (Pour ce dernier, cela pourrait être plus facile et plus sûr de simplement faire définir ('Undef', null); avant le eval .)


(Aussi, êtes-vous vraiment devez inclure à la fois une copie de la chaîne d'origine et la sortie print_r 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ù {} apparaîtrait dans la chaîne.


Vous pouvez les remplacer avec quelque chose comme "tableau (# {\ n" et ") #} \ n" puis boucle via la sortie pour annuler le remplacement. (En incluant { et } 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 et le fait que cela ressemble plus à un kroup plutôt qu'à une solution.



3
votes

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 : avec => et ajouté undef 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.

résultat est le suivant: xxx

est-ce ce que vous cherchez?


0 commentaires

5
votes

Vous avez un certain nombre de suggestions pour essayer d'analyser une manière ou une autre, mais la vraie question est pourquoi?

Pourquoi pas seulement avoir un petit programme PERL qui le charge et épine une chaîne JSON équivalente.

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.

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.

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).


2 commentaires

C'est la solution évidente et seulement robuste.


Il est également plus sûr que d'utiliser un eval



4
votes

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);
}


0 commentaires