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 :

modification d'un array multiligne


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut modification d'un array multiligne
    Bonjour,

    je suis en train de créer un fichier CSV pour récupérer les valeurs des cellules pour créer des fichiers de configurations.
    Je lis le fichier avec le module CPAN TEXT::CSV et dans une cellule je peux avoir plusieurs résultat.

    Ce qui donne en gros ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $route = "192.168.0.0 255.255.255.0 10.0.0.1
    192.168.1.0 255.255.255.0 10.0.0.1
    192.168.2.0 255.255.255.0 10.0.0.1";

    Le but est de rajouter "ip route" avant chaque ligne pour l'intégrer dans un fichier ultérieusement.

    J'ai réussi à faire le rajout en passant par une array.

    Mais est ce propre?
    Est ce que je peux directement modifier la scalar?

    J'ai eu deux possibilités.

    ### 1er solution ###
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my @ligne = split /\n/, $route;
     
     
     
    #foreach my $iproute (@ligne) {
    #    $iproute = "ip route $iproute";
    #    print "$iproute\n";
    #    }
     
    #print @ligne;

    ### 2è solution ###

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my @lines;
     
    foreach (@ligne) {
         s/^$_/ip route $_\n/;
        push @lines, $_;
        }
     
    $lines[-1] =~ s/\n$//;  
     
    print @lines;
    ### Résultat ###

    ip route 192.168.0.0 255.255.255.0 10.0.0.1
    ip route 192.168.1.0 255.255.255.0 10.0.0.1
    ip route 192.168.2.0 255.255.255.0 10.0.0.1



    Si il y a aussi un moyen de supprimer le dernier retour à la ligne en fin de la boucle je suis preneur

  2. #2
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Une substitution globale suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Taisha:~/perl/forum $ perl -E 'say s/(.+)/prefix $1/rg for "a\nb\nc"'
    prefix a
    prefix b
    prefix c
    Taisha:~/perl/forum $
    donc dans ton cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Taisha:~/perl/forum $ perl -E '
    my $route = "192.168.0.0 255.255.255.0 10.0.0.1
    192.168.1.0 255.255.255.0 10.0.0.1
    192.168.2.0 255.255.255.0 10.0.0.1";
    $route =~ s/(.+)/ip route $1/g;
    say $route
    '
    ip route 192.168.0.0 255.255.255.0 10.0.0.1
    ip route 192.168.1.0 255.255.255.0 10.0.0.1
    ip route 192.168.2.0 255.255.255.0 10.0.0.1
    Taisha:~/perl/forum $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Super ca fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $route =~ s/(.+)/ip route $1/g;
    Je ne savais pas que l'option /g fonctionnait aussi sur le multiligne mais uniquement l'uniligne.

    Merci !

  4. #4
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Autre méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $route =~ s/^/ip route /mg;
    (le flag m indique qu'on est en multiligne, et que ^ matche à chaque début de ligne)
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Effectivement ca fonctionne aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $route =~ s/^/ip route /mg;
    Résultat:
    ip route 192.168.0.0 255.255.255.0 10.0.0.1
    ip route 192.168.1.0 255.255.255.0 10.0.0.1
    ip route 192.168.2.0 255.255.255.0 10.0.0.1

    Il faut de toute façon le /g

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $route =~ s/^/ip route /m;
    Résultat:
    ip route 192.168.0.0 255.255.255.0 10.0.0.1
    192.168.1.0 255.255.255.0 10.0.0.1
    192.168.2.0 255.255.255.0 10.0.0.1

    Au final ta première solution est la plus souple on dirait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $route =~ s/(.+)/ip route $1/g;

  6. #6
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par caramon _majere Voir le message
    Au final ta première solution est la plus souple on dirait
    Elle est en fait plus contrainte. Si tu veux préfixer aussi les lignes vides la seconde est meilleure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Taisha:~/perl/forum $ perl -E 'say s/(.+)/prefix $1/gr for "a\nb\n\nc"'
    prefix a
    prefix b
     
    prefix c
    Taisha:~/perl/forum $ perl -E 'say s/^/prefix /mgr for "a\nb\n\nc"'
    prefix a
    prefix b
    prefix 
    prefix c
    Taisha:~/perl/forum $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    ah, je regarderai ce soir, je vais manquer de temps cet après midi.

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    C'est bon je viens de tester la différence

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/09/2009, 10h07
  2. [JavaScript] [SRC] array_map() modification de tous les elements d'un array avec une fonction
    Par SpaceFrog dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/07/2009, 13h28
  3. Réponses: 3
    Dernier message: 11/05/2008, 05h05
  4. Réponses: 2
    Dernier message: 06/03/2007, 12h32
  5. Réponses: 2
    Dernier message: 04/03/2007, 16h59

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