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 script Perl - merci d'avance de votre aide


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut Problème de script Perl - merci d'avance de votre aide
    Bonjour,

    Mon problème est que je n'ai jamais touché à Perl avant hier, et l'entreprise qui serait susceptible de m'embaucher me demande de réaliser un script pour tester mes capacités.

    Je ne demande qu'à apprendre, mais là ça fait beaucoup d'un coup, j'ai passé presque toute la nuit sur ce script, qui doit convertir un simple fichier texte en fichier d'enregistrement DNS.
    Je dois le rendre aujourd'hui, et ça ne fonctionne toujours pas

    Est-ce que quelqu'un pourrait m'aider ici svp ?

    je poste un ex du fichier d'entrée + mon script foireux au cas où :

    fichier entrée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    paris.zeni.fr
    lille.zeni;fr
    marseille.zen.fr
     
    #
    nîmes.zeni.fr
    chantilly.zeni.fr
    angers.zeni.fr
    st-jean.zeni.fr
    Je ne dois pas tenir compte des lignes commentées, vides, ou qui comprennent des lettres autres que a..z ou point ou tiret => ces lignes vont dans un fichier de rejet

    script :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #!/usr/bin/perl
     
    # test alphabetique
    # remplir une liste avec l'alphabet minuscule plus les points et tirets
     
    @alphabet = ("a".."z");
    $alphabet = '-'.".";
    push(@alphabet,$alphabet);
     
    # initialiser une liste qui contiendra la ligne en cours
     
    @liste = ("");
     
    # ouvrir le fichier d'entrée
    # si non trouvé afficher erreur et quitter
     
    #------------------------------------------------------------------------------------#
     
    $l = 0; #initialise un compteur de lignes
     
    open(FICHIER, "<$ARGV[0]") || die "Fichier d'entrée non trouvé !\n";
     
    #Lire le fichier d'entrée
     
    while(<FICHIER>)
     {
      lecture:
      if($l == 0) # lire la première ligne du fichier
       {
        push(@lignes,$_); #remplir @ligne avec ligne actuelle
       } 
     }
    close(FICHIER);
     
    for (@ligne) #pour chaque ligne lue :
     {
      until($ligne[$i] ne $alphabet[$i]) #et jusqu'à ce qu'un caractère lu ne soit pas compris dans la liste @alphabet
       {
        $i++ #incrémente indice pour parcourir toute la liste @alphabet
     
        @fqdn = split(/./,$ligne); #découper la ligne suivant les points pour avoir : ville, zeni, fr  (si ça ne marche pas essayer avec $_)
     
        if ($fqdn[1] eq 'zeni') and ($fqdn[2] eq 'fr') #si la forme de la liste fqdn correspond à ville, zeni, fr
     
         {
          open(SORTIE, ">hosts") || die "Fichier de sortie non trouvé !\n"; # ouvrir le fichier de sortie pour l'écriture
     
          print($fqdn[0],"\t"x2,IN,"\t",A,"\t",10.0.0.1,"\n","\t"x3,IN,"\t",'MX 1',"mail\.$fqdn[0]\.$fqdn[1]\.$fqdn[2]\.") #écrire le fichier de sortie
     
          $l++
          goto lecture
         else goto rejet
          } #end if
         } #end until
     
    rejet:
    open(REJET, ">hosts.reject") || die "Fichier de rejet non trouvé !\n"; # ouvrir le fichier de rejet pour l'écriture
     
    print("$ligne\.") #écrire le fichier de rejet (si ça ne marche pas essayer avec $_)
    $l++
    goto lecture
    --------------------------------------------------------------------

    et voila les erreurs renvoyées (très nombreuses je le conçois !) :
    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
     
    Array found where operator expected at ./script.pl line 41, near ""
            (Missing semicolon on previous line?)
    Scalar found where operator expected at ./script.pl line 50, near ") #écrire le fichier de sortie
     
          $l"
            (Missing operator before $l?)
    Scalar found where operator expected at ./script.pl line 60, near ") #écrire le fichier de rejet (si ça ne marche pas essayer avec $_)
    $l"
            (Missing semicolon on previous line?)
    syntax error at ./script.pl line 41, near "@fqdn "
    syntax error at ./script.pl line 43, near ") and"
    syntax error at ./script.pl line 50, near ") #écrire le fichier de sortie
     
          $l"
    syntax error at ./script.pl line 60, near ") #écrire le fichier de rejet (si ça ne marche pas essayer avec $_)
    $l"
    Missing right curly or square bracket at ./script.pl line 74, at end of line
    Execution of ./script.pl aborted due to compilation errors.
    Merci par avance de votre aide

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Pourrais-tu utiliser les balises codes (icone dièse dans la barre d'outil), ça rendrait ton script plus lisible.
    Je veux bien te conseiller afin d'améliorer ton script mais je n'ai aucune idée du format d'un fichier d'enregistrement DNS. Va faire un tour dans la FAQ et regarde les expressions régulières, cela devrait être utile.

    Voici comment parcourir un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open(FICHIER, "<$ARGV[0]") || die "Fichier d'entrée non trouvé !\n";
    my $line
     
    while (my $line = <FICHIER>){
    	if ($line ....) {
     
    	}	
    }
     
    close(FICHIER);

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut @jasmine80
    Merci beaucoup pour ta réponse Jasmine80

    J'ai oublié en effet de donner un exemple du fichier de sortie :

    ville1 IN A 10.0.0.1
    IN MX 1 mail.ville1.zeni.fr
    ville2 IN A 10.0.0.1
    IN MX 1 mail.ville2.zeni.fr
    etc...


    j'essaie d'adapter tout ça selon tes conseils, et aussi ceux d'un ami que je poste ici :

    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
    21
    22
    23
    #!/usr/bin/perl
    if ( open (fichier,"zeni.list"))                        # ouverture fichier
    {
            $ligne=<fichier>;                               # lecture premiere ligne
            while ($ligne ne "")
            {
                    print ("\nligne: $ligne\n");
                    if ( $ligne !~ /.*zeni\.fr$/ )          # si la ligne ne se termine pas par zeni.fr
                    {
                            print ("la ligne est rejetee car ne se termine pas par zeni.fr\n") ;
                    }
                    elsif ( $ligne !~ /[0-9a-zA-Z]/ )       # (TEST PAS BON) ou si elle contient des caracteres bizarres
                    {
                            print ("la ligne est rejetee\n");
                    }
                    elsif (0)                               # sinon
                    {
                    print("la ligne est bonne\n");
                    }
                    $ligne=<fichier>;                       # lecture ligne suivante
            }
    close fichier;
    }

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Mais c'est très bien tout ça, ça avance. As-tu encore des messages d'erreur?
    ... elsif(0) c'est étrange ... un simple else ne suffirait il pas? mais attends peut-être l'avis de quelqu'un plus compétent que moi.

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par fractale69 Voir le message
    Bonjour,

    Mon problème est que je n'ai jamais touché à Perl avant hier, et l'entreprise qui serait susceptible de m'embaucher me demande de réaliser un script pour tester mes capacités.
    Bah je comprends pas comment tu peux dire à l'entreprise qui t'embauche que tu connais perl alors que ce n'est pas le cas .
    Car si tu avais été honnête, il ne t'aurais pas demandé de faire un script.
    De plus, ça se verra sur la conception du script que tu connais perl ou non.


  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bah je comprends pas comment tu peux dire à l'entreprise qui t'embauche que tu connais perl alors que ce n'est pas le cas .
    Car si tu avais été honnête, il ne t'aurais pas demandé de faire un script.
    De plus, ça se verra sur la conception du script que tu connais perl ou non.

    Bonjour Djibril,

    J'ai été honnête rassure-toi le responsable sait que je ne connais pas Perl à la base, la condition d'embauche ici est justement de démontrer ma volonté d'implication en apprenant les bases de Perl : on ne s'attend donc pas à un script parfait sans doute...

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Mais c'est très bien tout ça, ça avance. As-tu encore des messages d'erreur?
    ... elsif(0) c'est étrange ... un simple else ne suffirait il pas? mais attends peut-être l'avis de quelqu'un plus compétent que moi.
    Je regarde ça je te fais un retour

    merci

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    J'ai été honnête rassure-toi le responsable sait que je ne connais pas Perl à la base, la condition d'embauche ici est justement de démontrer ma volonté d'implication en apprenant les bases de Perl : on ne s'attend donc pas à un script parfait sans doute...
    C'est bien, tu sembles vraiment motivé. Si tu connais d'autres langages, Perl ne devrait pas être bien difficile à apprendre, me semble-t'il Bon courage

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Bien sûr je suis motivé ! Je rêve d'occuper ce poste d'admin systèmes et réseaux, si je dois apprendre Perl pour ça... tant mieux

    Là j'ai plus un problème de temps, surtout que je suis au boulot jusqu'à ce soir 22h. Je pense que je vais repousser un peu l'échéance pour rendre un truc propre.
    En tout cas un grand merci pour ces encouragements !

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon allez un petit coup de main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    open (FICHIER, $Fichier );
    my $i = 1;
    while ( my $ligne = <FICHIER> ) {
      chomp $ligne;
      unless ( $ligne =~ m{(?:[a-z]|[\.-])}i ) {
        next;
      }
      print "ville$i IN A 10.0.0.1\n";
      print "IN MX 1 mail.ville$i.$ligne\n";
      $i ++;
    }
    close(FICHIER)

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut Erreurs à la compilation
    Djibril,
    Merci beaucoup pour ta rapidité avant tout !
    Ce code a l'air bien optimisé en plus, je pourrai jamais faire croire que c'est de moi
    Va falloir que je dés-optimise ! (je déconne)

    Bon plus sérieusement, quand je teste j'ai des erreurs de compilation de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    global symbol "$i" requires explicit package name at script.pl line 12
    global symbol "$i" requires explicit package name at script.pl line 13
    global symbol "$i" requires explicit package name at script.pl line 14
    Execution aborted due to compilation errors
    Il manquerait des modules Perl sur la machine sur laquelle je l'exécute ?

  12. #12
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Tu dois simplement déclarer ta variable en utilisant 'my'. déclare la bien avant le while, qu'elle ne soit pas remis à 0 à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my $i = 0;
    while(){
     
       $i++;
    }

    Surtout, tâche de bien comprendre le code de Djibril ... tu pourrais avoir l'air con sinon

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Génial !
    J'ai passé pas mal de temps pour comprendre le code, j'avoue que c'est vraiment pas mal
    Il me reste 2~3 trucs à mettre au point, mais avec les tutos et docs disponibles sur le net ça devrait le faire !

    à bientôt je poste ça dès que c'est ok

    Voilà où j'en suis :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #!/usr/bin/perl
     
    use strict;
     
    use warnings;
     
     
    #initialise les variables
    my $i = 0; 
    my $rejet = "";
     
    open (FICHIER, $ARGV[0]) or die ("impossible de lire le fichier $ARGV[0]\n"); #si fichier non trouvé afficher erreur et quitter
     
     
    while ( my $ligne = <FICHIER> ) {
     
     
      chomp $ligne;					#supprime le retour chariot contenu dans $ligne
      if(index( $ligne,".zeni.fr") >= 0) {		#vérification de la structure ville.zeni.fr
     
      	if( $ligne
      		unless( $ligne =~ /[^a-z\.-]/) {	# test caractères (on n'execute pas si la ligne comporte tout caractère(sauf 							minuscule,point,tiret) 
      #open(SORTIE, ">>hosts") || die "Fichier de sortie non trouvé !\n";	#ouvrir le fichier de sortie pour l'écriture
     
      #while ( my $ligne = <SORTIE> ) {
     
     
      print "$ligne\t\tIN\tA\t10.0.0.1\n";
     
      print "\t\t\tIN\tMX 1\tmail.$ligne\n";
     
      }
    #  $rejet = $ligne;
    #  print "ligne rejetée : $rejet\n";
    #  $ligne = "";
    #  next; 					
     }
     
    }
     
    close(FICHIER);
    Fractale69

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut expressions régulières
    galères mais puissants

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unless ( $ligne =~ /^[\.]|[^a-z\.-]/) {	# test caractères (on n'execute pas si la ligne:debute par un point ou comporte tout caractère(^)sauf minuscules,points,tirets)
    j'ai fini par arriver à faire mon test en une ligne

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Salut à vous,

    Je crois que je suis pas loin, mais là ça bloque, j'ai noté l'endroit et je trouve pas l'erreur de syntaxe, je dois être trop fatigué je regarderai ça demain matin, enfin tout à l'heure

    Bon voila ce que ça donne pour l'instant :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #!/usr/bin/perl -w
     
    use strict;
     
    #initialise les variables
    my $rejet = "";
     
    open (FICHIER, $ARGV[0]) or die ("open: $! $ARGV[0]\n"); #si fichier non trouvé afficher erreur et quitter
     
     
    while ( my $ligne = <FICHIER> ) {
     
     
      chomp $ligne;					#supprime le retour chariot de fin de ligne
      if (index( $ligne,".zeni.fr") >= 0) {		#vérification de la structure ville.zeni.fr
     
     
      	# test caractères (on n'exécute pas si la ligne:débute par un point ou comporte tout caractère(^),sauf minuscules,points,tirets) 
      	unless ( $ligne =~ /^[\.]|[^a-z\.-]/) {
     
      	open(SORTIE, ">> $ARGV[1]") or die ("open: $! $ARGV[1]\n")	#ouvrir le fichier de sortie pour l'écriture
     
      		#while ( $ligne = <SORTIE> ) {	#commencer à écrire les enregistrements DNS
     
     
      		print (SORTIE "$ligne\t\tIN\tA\t10.0.0.1\n\t\t\tIN\tMX 1\tmail.$ligne\n"); # <==[ERREUR] écrire dans le fichier de sortie
      		#}
      	}
      }					
    }
     
    close(FICHIER);

  16. #16
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ouvre le fichier de sortie une seule fois avant la boucle, pas à chaque tour.

  17. #17
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Voilà; teste et adapte toi
    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
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    #initialise les variables
    my $FichierEntre = $ARGV[0];
    my $FichierRejet = $ARGV[1];
    my $FichierOK = "ok.txt";
     
    open (FICHIER, $FichierEntre) or die ("Impossible de lire $FichierEntre : $!\n"); #si fichier non trouvé afficher erreur et quitter
    open (REJET, ">$FichierRejet") or die ("Impossible d'ecrire dans $FichierRejet : $!\n"); 
    open (FICHIEROK, ">$FichierOK") or die ("Impossible d'ecrire dans $FichierOK : $!\n"); 
    my $i = 1;
    while ( my $ligne = <FICHIER> ) {
      # Supprime le retour chariot de fin de ligne
      chomp $ligne; 
      # test caractères (on n'exécute pas si la ligne:débute par un point 
      # ou comporte tout caractère(^),sauf minuscules,
      unless ( $ligne =~ m{(?:[a-z]|[\.-])}i ) {
        print REJET "$ligne\t\tIN\tA\t10.0.0.1\n\t\t\tIN\tMX 1\tmail.$ligne\n\n";
      }
      print FICHIEROK "ville$i IN A 10.0.0.1\n";
      print FICHIEROK "IN MX 1 mail.ville$i.$ligne\n";
      $i ++;
    }
    close(FICHIER);
    close(REJET);
    close(FICHIEROK);

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bon allez un petit coup de main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    open (FICHIER, $Fichier );
    my $i = 1;
    while ( my $ligne = <FICHIER> ) {
      chomp $ligne;
      unless ( $ligne =~ m{(?:[a-z]|[\.-])}i ) {
        next;
      }
      print "ville$i IN A 10.0.0.1\n";
      print "IN MX 1 mail.ville$i.$ligne\n";
      $i ++;
    }
    close(FICHIER)
    Salut Djibril, Jasmine80,

    Bon, à partir du sérieux coup de main que vous m'avez fourni j'en suis là :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #!/usr/bin/perl -w
     
    use strict;
     
     
    #initialise les variables
    my $rejectfile = "";
    my $i = 0;
    my $ligne = "";
     
    #trouver position du début d'extension du fichier d'entrée pour la remplacer par .rejet (ou ajout si pas d'extension)
    $i = index($ARGV[0],".");
    $rejectfile = substr ($ARGV[0],0,$i)."\.rejet";
     
    #ouverture fichier d'entrée en lecture
    open (FICHIER, $ARGV[0]) or die ("open: $! $ARGV[0]\n");#si erreur afficher erreur et quitter
     
     
    while ( my $ligne = <FICHIER> ) {			#tant que le fichier n'est pas entièrement lu faire :
     
    	chomp $ligne;					#suppression retour chariot de fin de ligne
    	if (index( $ligne,".zeni.fr") >= 0)	{	#vérification de la structure ville.zeni.fr : si ok continuer
     
     
      	unless ( $ligne =~ /^[\.]|[^a-z\.-]/)	{	# test caractères (on n'exécute pas si la ligne:débute par un point, ou si elle comporte tout caractère(^),sauf minuscules,points ou tirets)
     
    	#ouverture du fichier de sortie pour écriture
      	open(SORTIE, ">> $ARGV[1]") or die ("open: $! $ARGV[1]\n");
     
      	print ( SORTIE "$ligne\t\tIN\tA\t10.0.0.1\n\t\t\tIN\tMX 1\tmail.$ligne\n"); # écriture dans le fichier de sortie
      	  					}
      						}
    	else					{	#si conditions non remplies la ligne en cours est non valide
     
     #ouverture du fichier de rejet pour écriture				  					
     open( REJET, ">> $rejectfile") or die ("open: $! $ARGV[1]\n");
     print ( REJET "$ligne\n");	# écriture dans le fichier de rejet
    						}				
    				}
    close(FICHIER);
    Le script fonctionne bien, il remplit toutes les conditions... ça manque peut-être un peu d'optimisation mais ça tourne !!!

    Il me manque juste 2 petites choses :

    1- envoyer un rapport par mail à la fin du type :
    traitement lancé le (date)
    N lignes traitées
    K lignes en erreur
    % d'erreurs

    listes des erreurs :
    -
    -
    -

    2- classer les lignes du fichier de sortie par ordre alphabétique

    voili voilou je vous tiens au courant dès que j'ai réussi

  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    Ouvre le fichier de sortie une seule fois avant la boucle, pas à chaque tour.
    merci du conseil matafan, je vais le suivre
    ps : j'avais pas vu les réponses juste avant la page était restée dans le cache de mon navigateur lol

  20. #20
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par djibril Voir le message
    Voilà; teste et adapte toi
    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
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    #initialise les variables
    my $FichierEntre = $ARGV[0];
    my $FichierRejet = $ARGV[1];
    my $FichierOK = "ok.txt";
     
    open (FICHIER, $FichierEntre) or die ("Impossible de lire $FichierEntre : $!\n"); #si fichier non trouvé afficher erreur et quitter
    open (REJET, ">$FichierRejet") or die ("Impossible d'ecrire dans $FichierRejet : $!\n"); 
    open (FICHIEROK, ">$FichierOK") or die ("Impossible d'ecrire dans $FichierOK : $!\n"); 
    my $i = 1;
    while ( my $ligne = <FICHIER> ) {
      # Supprime le retour chariot de fin de ligne
      chomp $ligne; 
      # test caractères (on n'exécute pas si la ligne:débute par un point 
      # ou comporte tout caractère(^),sauf minuscules,
      unless ( $ligne =~ m{(?:[a-z]|[\.-])}i ) {
        print REJET "$ligne\t\tIN\tA\t10.0.0.1\n\t\t\tIN\tMX 1\tmail.$ligne\n\n";
      }
      print FICHIEROK "ville$i IN A 10.0.0.1\n";
      print FICHIEROK "IN MX 1 mail.ville$i.$ligne\n";
      $i ++;
    }
    close(FICHIER);
    close(REJET);
    close(FICHIEROK);
    Hello Djibril,

    Je viens de voir ton dernier message, ça me semble plus simple que mon test en effet, par contre l'expression régulière dans la conditions unless ne correspond pas tout à fait aux conditions que je dois respecter, enfin je crois ? (prendre uniquement les lignes qui ne contiennent que des caractères minuscules, points ou tirets, rejeter les autres sauf lignes vides ou commentées à ignorer)

    J'essaie de comprendre tout ton code et d'adater le mien, et je te fais un retour

    Fractale69

Discussions similaires

  1. scenario UML Merci d'avance pour votre aide !
    Par jessicaf dans le forum Cas d'utilisation
    Réponses: 1
    Dernier message: 14/12/2008, 10h29
  2. Besoin d'aide script perl MERCI
    Par la_star160 dans le forum Langage
    Réponses: 1
    Dernier message: 11/08/2008, 12h36
  3. Problème pour exécuter un script Perl
    Par jungle360 dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2006, 14h37
  4. [Newbie] Problème d'appel de script perl
    Par NoCoZ dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 21/02/2006, 17h43
  5. Problème execution script perl
    Par 00sebbe dans le forum Apache
    Réponses: 1
    Dernier message: 29/08/2005, 14h43

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