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 :

Probléme de filtrage dans une boucle


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut Probléme de filtrage dans une boucle
    Bonjour ,

    J'ais extrait d'un fichier dns les adresse des reseau (elles étaient en commentaire) malheuresement certaines sont de la forme 127.25.x.x 132.56.X.y ou encore 127.0.2.x et je voudrais les avoir toutes sous la forme 125.32.0.0.
    Je veut donc remplacer les lettres contenues dans les adresse par des zero :
    J'ai efféctué le code suivant :
    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
    $i=0;
    while($lines = <FICH>){
    #si la ligne est du type : '<;*** - 2 ou + espaces - chaîne de caractére - 1 ou + espaces - chaines de caractére>
    	if($lines =~ /;\*\*\*\s{2,}(.+?)\s+(.+)/)
    	{
    		#On memorise les variables temporaire
    		$adresse=$1;
    		$nom=$2;
     
    		#Test si l'adresse est du type 127.2.x.x pour le transformer en 127.2.0.0
    		if($adresse=~/\w.\w.[a-z].[a-z]/)
    		{
    		$adresse=~s/[a-z].[a-z]/0.0/g; #Remplacement des x.x par 0.0
    		}
    		#on retire les espaces et les ;*** et on inscrit le resultat deu traitemant dans le fichier
    		print(FICHOUT "$adresse;$nom\n");
    		$i++; #Incrémentation du nombre de reseau trouvé dans le fichier
    	}
     
    }
    Mais il ne fonctionne que pour la première ligne du fichier alors que la modif est située dans la boucle qui parcourt le fichier. Je ne voit pas pourquoi ? ?
    Pourriez jeté un petit coup d'oeil rapide , quand on a un point de vu exterieur c'est plus claire et facile.Ce n'est pas évident de l'avoir sur ses propre travaux.

    Je continue de reflechir au probléme

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 88
    Par défaut
    Essaie ca,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    my $adresse = "111.22.33.44";
     
    if ($adresse=~/\d+\.\d+\...*/)
    {
            $adresse =~ s/(\d+)\.(\d+)\..*/$1.$2.0.0/;
    }
    print "$adresse\n" ;
     
    #Affiche 111.222.0.0

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Cela marche parfaitement je n'avais pas pensé a sauvegarder les premier termes de l'adresse dans les variables temporaires.
    Je ne comprend pas pourquoi les lignes que j'avais écrite ne fonctionne que pour la premiére ligne du fichier ? ?
    A chaque passage dans la boucle la variable adresse prendera une nouvelle valeur c'est pour cela que je voyais pas pourquoi sauvegarder certains termes.

    Merci de me faire partager tes competences

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Gad29
    Cela marche parfaitement je n'avais pas pensé a sauvegarder les premier termes de l'adresse dans les variables temporaires.
    Que veux tu dire ? Je ne touche même pas aux premiers termes de l'adresse.

    Citation Envoyé par Gad29
    Je ne comprend pas pourquoi les lignes que j'avais écrite ne fonctionne que pour la premiére ligne du fichier ? ?
    A chaque passage dans la boucle la variable adresse prendera une nouvelle valeur c'est pour cela que je voyais pas pourquoi sauvegarder certains termes.

    Merci de me faire partager tes competences
    C'est très probablement parce que ta première ligne correspondait par miracle à ta regex et les autres non, si tu mélangeais les lignes, ce ne serait plus la première qui serait modifiée, mais toujours la même.

    --
    Jedaï

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Encore un fois votre aide m'as étée précieuse merci encore

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par Gad29
    J'ai efféctué le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		if($adresse=~/\w.\w.[a-z].[a-z]/)
    Je résume donc : une lettre ou un chiffre suivie par "n'importe quoi" (le point est un caractère particulier pour les regex), suivie par une lettre ou un chiffre suivie par "n'importe quoi", suivie par une lettre suivie par "n'importe quoi", suivie par une lettre suivie par "n'importe quoi".

    Pas tout à fait une adresse IP ça...

    Par ailleurs, il est inutile de faire un test puis de faire la substitution, alors que la substitution n'aura pas lieu de toute façon si on la met directement et que la chaîne ne correspond pas au test :
    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
    $i=0;
    while($lines = <FICH>){
    #si la ligne est du type : '<;*** - 2 ou + espaces - chaîne de caractére - 1 ou + espaces - chaines de caractére>
    	if($lines =~ /;\*\*\*\s{2,}(.+?)\s+(.+)/)
    	{
    		#On memorise les variables temporaire
    		$adresse=$1;
    		$nom=$2;
     
    		$adresse =~ s/[a-z]+\.[a-z]+$/0.0/i;
    		$adresse =~ s/[a-z]+$/0/i;
    		#on retire les espaces et les ;*** et on inscrit le resultat deu traitemant dans le fichier
    		print(FICHOUT "$adresse;$nom\n");
    		$i++; #Incrémentation du nombre de reseau trouvé dans le fichier
    	}
     
    }
    --
    Jedaï

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

Discussions similaires

  1. [SimpleXML] Google Maps, Problème d'encoding dans une boucle
    Par yahn dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/09/2006, 19h40
  2. Réponses: 2
    Dernier message: 28/08/2006, 13h16
  3. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  4. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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