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 :

passer une variable en tant que text dans une fonction


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Par défaut passer une variable en tant que text dans une fonction
    Bonjour,

    Je suis débutant en perl, je doit modifier du texte dans un fichier à certain endroit.
    Je doit faire plusieurs modification alors j'ai décidé de faire une petite fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub substitution {
    	my ($ligneAModifier, $limite1 ,$limite2 , $motARemplacer, $motDeRemplacement) = @_;
    	my ( $val1, $val2) = split(/$limite1/i, $ligneAModifier , 2);
    	my ( $val3, $val4) = split(/$limite2/i, $val2, 2);
    	$val3 =~ s/$motARemplacer/$motDeRemplacement/g;
    	return $val1."$limite1".$val3."$limite2".$val4;
    }
    Alors avec une version sans fonction cela marche, mais dès que j'utilise la fonction je n'arrive plus à lui faire comprendre le $1 lorsque je l'appelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if($ligne2 =~ /VBCode/i){
            $ligne2 = substitution($ligne2, "Inherits", "Auto-Generated", "Friend", "\' Friend");
    	$ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", "(\\w+\\s*=)", "\' \$1");
    	print $FhModifie $ligne2;
    }
    En effet sans fonction cela me donné le regex s/(\\w+\\s*=)/' $1/g
    Or maintenant quand il doit utiliser s/$motARemplacer/$motDeRemplacement/g,
    soit je met "\' \$1" pour $motDeRemplacement, et il me remplace dans le fichier par ' $1,
    soit je met "\' $1" et la il est pas content car il ne sait pas d'ou sort ce $1,

    Comment je peut faire pour passer le $1 et qu'il le prenne en considération en tant que s/(\\w+\\s*=)/' $1/g?

    Merci d'avance (je suis nouveau sur le site dont si j'ai fait quelque chose de mal ou autre dites le moi )

  2. #2
    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 : 59
    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
    Par défaut
    As-tu essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", qr/(\w+\s*=)/, "' \$1");
    Le mot à remplacer est une regexp, donc autant passer une regexp "compilée" avec l'opérateur qr (et pas besoin d'anti-slasher)
    Pour le $1, il faut naturellement anti-slasher $, mais pas nécessaire pour la quote simple.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    As-tu essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", qr/(\w+\s*=)/, "' \$1");
    Le mot à remplacer est une regexp, donc autant passer une regexp "compilée" avec l'opérateur qr (et pas besoin d'anti-slasher)
    Pour le $1, il faut naturellement anti-slasher $, mais pas nécessaire pour la quote simple.


    qr/(\w+\s*=)/ Fonctionne mais le probleme avec $1 reste le même.

    Dans s/(\w+\s*=)/' $1/g, lorsque je l'utilisais sans fonction,
    $1 vaut bien la valeur que (\w+\s*=) à trouvé,
    ce qui me remplace, par exemple Can393 = nothing par ' Can393 = nothing.

    Alors que avec "' \$1" passé comme paramètre , il ne joue pas le rôle de mémoire pour (\w+\s*=),
    mais me remplace Can393 = nothing par ' $1 nothing.

  4. #4
    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 : 59
    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
    Par défaut
    Effectivement, le $1 ne peut être inséré que littéralement dans la regexp.

    Une manière de contourner le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", qr/(\w+\s*=)/, sub { "' $1" });
    et dans substitution, remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $val3 =~ s/$motARemplacer/$motDeRemplacement/g;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $val3 =~ s/$motARemplacer/$motDeRemplacement->()/ge;

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 19
    Par défaut
    Alors la il me remplace par:
    CODE(0x25faa90) nothing

    Il n'a pas l'air content .

    J'ai testé aussi avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", qr/((\w+\s*=))/, "' ".\$1);
    ça me donne ' SCALAR(0x38f0f8) nothing

    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", qr/((\w+\s*=))/, "' ".(\[\$1]));
    ça me donne ' REF(0x4bcec0) nothing

    Avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ligne2 = substitution($ligne2, "Protected Sub CleanupUserCode", "Sub", qr/((\w+\s*=))/, "' ".([\$1]));
    ça me donne ' ARRAY(0x32cd70) Nothing

    Enfin bref je pif juste des truc je sais même pas pourquoi

  6. #6
    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 : 59
    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
    Par défaut
    Peux-tu me remontrer ton code intégralement avec exactement les modifications que je t'ai proposées ?

    (et me dire la version de ton perl)

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

Discussions similaires

  1. [Batch] Mettre une ligne d'un fichier texte dans une variable
    Par guiguir68 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/08/2014, 16h45
  2. Réponses: 6
    Dernier message: 28/05/2014, 14h16
  3. Réponses: 1
    Dernier message: 23/07/2009, 21h14
  4. Réponses: 5
    Dernier message: 04/12/2008, 15h58
  5. Réponses: 10
    Dernier message: 26/07/2007, 14h16

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