IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Récupérer un array php avec PERL


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut Récupérer un array php avec PERL
    Bonjour,

    Mon problème est le suivant, je ne sais pas comment faire pour récupérer dans mon script perl (valeurs.pl), un tableau tel que :
    $a = array('b','c','d','e');
    qui se trouve dans un fichier liste.php.

    J'ai cherché sur la toile mais je n'ai pas trouvé grand chose de très utile..

    Si vous avez une idée je suis preneur !

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Salut ciols,

    Si ce que tu veux c'est créer un array Perl en copiant et collant la définition d'un array provenant d'un source en Php, tu fais juste ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @a = ('b','c','d','e');
    et tu peux ensuite l'utiliser comme n'importe quel array en Perl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # énumération du contenu
    foreach my $entree (@a) {
      say $entree;
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # premier élément
    say $a[0];
    etc.


    Eks

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Euh, pas bien clair à mes yeux, tu veux lire le fichier d'un script PHP à l'aide d'un script Perl et récupérer dans le script PHP une définition de tableau pour utiliser les valeurs dans un script Perl, c'est cela?

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    J'ai un fichier qui contient tous mes tableaux que j'utilise dans mes différents scripts php. Cependant, j'ai besoin d'un de ces tableaux dans un script PERL.
    Pour utiliser un de ces tableaux en php, il suffit d'include le fichier où les tableaux sont déclarés. Mais en PERL je ne sais pas comment faire.

    Je veux récupérer le tableau $infoTraf qui se situe dans liste.php et utilisé ce tableau dans mon script PERL (avoir en quelque sorte @infoTraf).

    La finalité de ça, c'est que si des modifications doivent survenir, il n'y aura qu'un seul fichier à modifier.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Je dirais que tu dois "parser" ton fichier PHP à la recherche de ton tableau PHP, et remplir un tableau Perl avec son contenu.

    Peut-être que ce module pourrais-être d'une aide appréciable pour "parser le PHP : PHP::Interpreter
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Donc, ce tu veux c'est utiliser dynamiquement des données organisées sous forme d'un tableau Php contenues dans un fichier .php, en les obtenant lors de l'exécution de ton script Perl.

    Pour cela, la solution la plus directe me parait d'utiliser une regexp pour matcher ton tableau, de transformer la chaîne de texte récupérée de façon à ce qu'elle respecte la syntaxe Perl et de passer cela à la fonction eval.

    avec un fichier.php comme cela (fantaisiste) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    echo 'Hello world';
    # les données contenues dans $infoTraf sont
    # également utilisées dans script.pl                                                                                                                                                                               
    echo '<hr>'; $infoTraf = array('b','c','d','e'); echo '<hr>';       # un commentaire
    ?>
    cela peut donner un script.pl comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/usr/bin/perl -T                                                                                                                                                                                                 
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my $file = 'fichier.php';
    my @infoTraf;
     
    open my $fh, $file or die "Could not open $file: $!";
     
    while (my $line = <$fh>)  {
        if ($line =~ /\$infoTraf\s*=\s*array\(([^;]+);/) {
            eval('@infoTraf = (' . $1 .';');
            last;
        }
    }
    close $fh;
     
    print Dumper(@infoTraf);
    qui produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $VAR1 = 'b';
    $VAR2 = 'c';
    $VAR3 = 'd';
    $VAR4 = 'e';
    Utiliser un parser complet pour faire cela me parait démesuré.

    Perl est explicitement lancé en mode "tainted". Il faut bien vérifier le contenu que tu extraies d'un autre fichier avant de le passer à eval (ou à un parser d'ailleurs). C'est le rôle de la regexp que de valider cela. La regexp pourrait être rendue plus stricte encore si elle pouvait spécifier le type de contenu attendu (mais on ne le connaît pas car tu mets des données d'exemple). En l'état, elle est cependant déjà raisonnablement sécurisée et fonctionnera bien sous réserve que les données contenues dans le tableau ne comportent pas de point-virgule.


    Eks

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Pour commencer, merci beaucoup pour votre aide !

    @Eks : Je vais tester ta solution dans les jours qui viennent ! Merci pour le détail et les explications.

    Si je rencontre un problème je reviendrai vers vous !

    Merci encore

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Me revoilà.

    Du coup j'ai tester ta solution voici le code :

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    open my $fh, $file or die "Could not open $file : $!";
     
    while (my $line = <$fh>)
    {
    	if ($line =~ /\$nomIndE\s*=\s*array\)([^;]+);/)
    	{
    		eval('@nomIndE = ('.$1.';');
    		last;
    	}
    	elsif ($line =~ /\$nomIndC\s*=\s*array\)([^;]+);/)
    	{
    		eval('@nomIndC = ('.$1.';');
    		last;
    	}
    }
     
    close $fh;
     
    print Dumper(@nomIndE);
    print "\n\n\n";
    print Dumper(@nomIndC);

    Je veux récupérer ces deux tableaux mais les Dumper n'affichent rien, est-ce un problème au niveau de la regex ? Ou de l'eval ?

    Dans mon fichier php qui liste tous les array dont j'ai besoin, il y a juste parfois des '-' et des '.' aucune autre ponctuation n'est présente.
    $nomIndE = array('succG','att.G','...','...');
    $nomIndC = array('g-att-a','g-s-n-a','...','...');
    Il y a une quinzaine de valeurs dans chaque tableau.

    Autre question, pour le fichier est ce qu'il doit forcément se situer à l'endroit du script perl ? J'ai essayer en mettant un chemin afin de ne pas l'avoir à l'endroit des scripts PERL mais ça n'a pas marché.

  9. #9
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Tu ne matches rien car dans ta regexp, tu as mis array\) au lieu de array\(.

    Par ailleurs, si tu cherches plusieurs tableaux, tu devrais retirer le last, qui va arrêter la boucle while, alors que tu cherches encore des choses.

    Note que les données ne devront pas non plus contenir de parenthèse fermante.

    Ton script devrait tester, en fin de boucle, que les tableaux ont bien été remplis, par exemple en faisant un test sur le tableau en contexte scalaire pour vérifier que le nombre d'éléments n'est pas zéro. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!@nomIndE) {
      print "Erreur : @nomIndE n'a pas été récupéré\n";
      exit;
    }
    Tu pourrais aussi tester le résultat de eval. Tu as des exemples ici.


    Eks

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    C'est parfait !! Exactement ce que je veux. Est ce que tu as une idée pour l'histoire du fichier ? J'avais mis :

    /var/www/html/.../.../.../liste_ind.php
    Mais il m'a dit qu'il n'y a pas de fichier ou de dossier à cet endroit alors que si.
    Du coup pour le moment je le mets au même endroit que le script perl.

  11. #11
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    s'il y a "/.../.../.../" (trois fois trois points consécutifs séparés par des slash) dans ce que tu as mis, cela me parait normal que Perl ne trouve rien. Le shell non plus, d'ailleurs, ne devrait rien trouver.

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Toutes mes excuses ces "/.../.../.../" sont la pour raccourcir le chemin, j'aurais du le préciser au moment où je l'ai écris...

    Le chemin que j'avais rentré tout à l'heure était bon (je l'ai testé sur la VM).

    Encore désolé pour ce manque de précision.

  13. #13
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par ciols Voir le message
    Le chemin que j'avais rentré tout à l'heure était bon (je l'ai testé sur la VM).
    Sauf erreur, je ne vois pas, dans aucun de tes posts sur ce fil de discussion, que aies posté un chemin complet.

    Si je comprend bien, tu as spécifié un chemin absolu dans tes tests.

    En tout état de cause, si le chemin est complet et exact, il est possible que l'utilisateur sous lequel est lancé le script Perl ne dispose pas des permissions lui permettant de lire le fichier liste_ind.php ou d'accéder au répertoire à l'arborescence des répertoires où il se trouve, ce qui pourrait provoquer ce message d'erreur. Ce problème ne serait pas lié à Perl.

    en étant loggé sous l'utilisateur lançant le script Perl, quel est le résultat de la commande suivante lancée à la ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls -al /var/www/html/.../.../.../liste_ind.php
    (avec le bon chemin)

  14. #14
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    personnellement, j'éviterais un eval sur des données provenant d'un fichier extérieur. Trop dangereux.

    Je partirais plutôt sur une solution de type regex comme celle décrite dans la session suivante sous le debugger Perl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      DB<1> $_ = q/echo '<hr>'; $infoTraf = array('b','c','d','e'); echo '<hr>';       # un commentaire/;
     
      DB<2> p $_
    echo '<hr>'; $infoTraf = array('b','c','d','e'); echo '<hr>';       # un commentaire
      DB<3> $search_array_name = qq/$infoTraf/; # initialisation du nom du tableau PHP recherché
     
      DB<4> $array_content = $1 if /$search_array_name\s*=\s*array\((.+?)\)/;
     
      DB<5> p  $array_content; # le contenu du tableau PHP
    'b','c','d','e'
      DB<6> $array_content =~ s/'//g;
     
      DB<7> @result_array = split /[,\s]+/, $array_content; 
     
      DB<8> x @result_array;
    0  'b'
    1  'c'
    2  'd'
    3  'e'
    Les seules lignes qui seraient à reprendre dans le vrai code sont les lignes 7, 11 et 13 (les autres ne sont que des vérifications que la commande sous le debugger donnait bien le résultat escompté).

  15. #15
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    @Eks : C'est réglé, c'était un problème de droits et de propriétaire du fichier !

    @LoLo78 : Eval est dangereux même si mon fichier reste sur une VM et en interne ?

  16. #16
    Membre averti
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Points : 411
    Points
    411
    Par défaut
    Sans connaître la nature exacte des données contenues dans les chaînes, l'idée d'utiliser eval m'est venue en lisant la proposition d'utiliser le module PHP::Interpreter. Car, de fait, eval permet de passer à l'interpréteur Perl une chaîne, de la parser et de l'exécuter, et que cette fonction est intégrée au langage.

    Cette fonction est considérée dangereuse, car utilisée sur une source de données extérieure non contrôlée, elle peut donner lieu à des problèmes de sécurité : tu exécutes le code correspondant.

    C'est pour cela que je disais :

    Perl est explicitement lancé en mode "tainted". Il faut bien vérifier le contenu que tu extraies d'un autre fichier avant de le passer à eval (ou à un parser d'ailleurs). C'est le rôle de la regexp que de valider cela. La regexp pourrait être rendue plus stricte encore si elle pouvait spécifier le type de contenu attendu (mais on ne le connaît pas car tu mets des données d'exemple). En l'état, elle est cependant déjà raisonnablement sécurisée et fonctionnera bien sous réserve que les données contenues dans le tableau ne comportent pas de point-virgule.
    imagine que quelqu'un modifie ton fichier.php pour remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a = array('b','c','d','e');
    par

    et que tu te contentes de passer cette ligne à eval sans vérification.

    Donc, l'opinion majoritaire est que la plupart du temps, lorsqu'on pense à utiliser eval, on peut faire autrement que d'utiliser eval et que l'on devrait faire autrement.

    Cependant, eval présente des avantages, car c'est donc aussi un parser utilisable à l'intérieur de ton script Perl.

    Son usage est pratique dans ton cas car Php et Perl partagent les mêmes règles de syntaxe pour la description du contenu d'un tableau simple de chaînes littérales (particulièrement séparation par des virgules, délimiteurs de texte, échappement des délimiteurs intégrés aux chaînes, les caractères blancs entre les séparateurs sont ignorés, etc.), que Perl va gérer sans que tu aies à traiter ces cas toi même. Son usage contrôlé peut être un choix pertinent, mais il faut savoir ce que l'on fait.

    La regexp que je propose arrête la capture au premier ; rencontré en partant de la définition de tableau Php, et évalue les données capturées dans une définition de tableau Perl codée en dur dans le code Perl. Tout ce qui risque d'arriver est que la définition de tableau soit invalide, que l'évaluation échoue et que le tableau reste vide (ce qui peut aussi arriver avec l'option split / regexp).

    Utiliser split, ou une regexp globale est aussi un choix possible, et certainement plus sûr dans l'absolu. Mais tu peux avoir à gérer d'avantage de cas particuliers, ainsi : si tes données comportent des virgules, des apostrophes (échappées) ou des espaces, si les délimiteurs de texte peuvent être des apostrophes ou des guillemets.

    Si tu n'es pas confronté à ces cas, la solution de Lolo78 est tout à fait valable et préférable :-)


    Eks

  17. #17
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Vous avez répondu à toutes mes questions je vais pouvoir le mettre en résolu.

    Merci beaucoup à tous les deux !

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer un fichier (Sftp) avec perl
    Par kameln dans le forum Actualités
    Réponses: 1
    Dernier message: 23/08/2011, 23h18
  2. Récupérer un array php par la callback de .post
    Par bastian06n dans le forum jQuery
    Réponses: 2
    Dernier message: 27/09/2010, 15h34
  3. Réponses: 1
    Dernier message: 31/01/2007, 12h59
  4. Réponses: 1
    Dernier message: 30/11/2006, 18h49
  5. Background d'un script php avec perl et unix (ou linux)
    Par fichiertempo dans le forum Web
    Réponses: 4
    Dernier message: 20/07/2006, 08h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo