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 :

"if/unless" et "or" dans la même ligne et post-condition


Sujet :

Langage Perl

  1. #1
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut "if/unless" et "or" dans la même ligne et post-condition
    Bonjour à tous,

    désolé pour le titre, je n'ai pas eu d'inspiration :-/ en gros, j'ai quelques soucis avec des tests / opérandes Perl utilisés en post-conditionnement

    Passons directement aux choses sérieuses (c'est un test, donc ne paniquez pas en voyant mon code ^^) :

    Pour ce test, je veux créer une arborescence de dossiers. L'idée, c'est que j'ai une liste de sous-dossiers imbriqués à créer C:/test/2007/10/23
    Je veux, en partant de la racine, tester l'existence de chaque dossier et le créer si besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unless (-e 'C:/test/2007/' && -d _) {
    	mkdir 'C:/test/2007/' or die "Creation impossible: $!";
    }
    marche bien, mais bon, je me dis qu'avec le post-conditionnement, y'a moyen d'aller plus vite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir 'C:/test/2007/10' unless (-e 'C:/test/2007/10' && -d _);
    C'est pas mal, mais je n'ai plus le "die" si il y'a un truc qui foire (protection en écriture, un fichier du nom du dossier existe, etc.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir 'C:/test/2007/10/23' unless (-e 'C:/test/2007/10/23' && -d _) or die "Creation impossible: $!";
    Ne marche plus, car si le dossier 'C:/test/2007/10/23' n'existe pas, le 'die' plante le programme "No such file or directory" ...

    Donc est-il possible de faire porter le die sur le mkdir ?!

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    raaaaaaaaaaaaaaah, le c*n...

    Ca faisait des jours que je planchais là dessus, et au moment de cliquer sur le bouton "poster", la révélation :'(

    inverser unless et die ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir 'C:/test/2007/10/23' or die "Creation impossible: $!" unless (-e 'C:/test/2007/10/23' && -d _);
    désolé

    edit: par contre, si quelqu'un peut regarder mon dernier message ci-dessous pour expliquer le pourquoi du comment, je suis preneur
    je repasserai en résolu ce soir !

  3. #3
    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 : 499 184
    Points
    499 184
    Par défaut
    tu peux mettre tous tes repertoires dans un tableau que tu trie avec sort.
    Ensuite tu parcours le tableau et cree le repertoire si ce dernier n'existe pas

  4. #4
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    ouais, en fait, le problème n'était pas de créer les dossiers, mais de le faire en faisant tout tenir sur une ligne... non pas pour faire joli =) mais juste pour comprendre comment ça fonctionne...

    cf ma réponse ci-dessus

    Merci quand même !

    Edit: je sens que je ne suis pas clair... j'ai fait ce petit bout de script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unless (-e 'C:/test/2007/' && -d _) {
    	mkdir 'C:/test/2007/' or die "Creation impossible: $!";
    }
     
    mkdir 'C:/test/2007/10' unless (-e 'C:/test/2007/10' && -d _);
     
    # mkdir 'C:/test/2007/10/23' unless (-e 'C:/test/2007/10/23' && -d _) or die "Creation impossible: $!";
     
    mkdir 'C:/test/2007/10/23' or die "Creation impossible: $!" unless (-e 'C:/test/2007/10/23' && -d _);
    pour tester les façons d'agencer les différents tests unless/or.
    Le dossier 2007 est bien créé, le dossier 2007/10 aussi, mais le dernier 2007/10/23 ne l'était pas avec la ligne en commentaire car le "die" portait sur le unless qui s'avérait faux. Il faut en fait inverser le "die" et le "unless" pour que le "die" s'applique au "mkdir" et que Perl gère le "unless" comme il faut également sur le "mkdir"
    Bon, par contre, je ne suis pas sur que cela soit très propre :/ Comment savoir que le "unless" s'applique bien au "mkdir" ? Je veux dire, en pratique, cela marche: il ne plante pas en créant le dossier même s'il existe... mais pourquoi le "unless" ne s'applique-t-il pas au "die" ?

    Je vais virer le résolu pour le cas où quelqu'un pourrait m'expliquer les règles sur ce point là

  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 : 499 184
    Points
    499 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my @repertoires = ("C:/toto/tutu",
                      "C:/test/2007/10/23",
                      "C:/test/2007/10",
                      "C:/test",
                      "C:/test/2007");
    foreach my $rep (sort @repertoires) {
      mkdir ("$rep", 0755) or warn("$rep pas cree\n") unless(-d $rep and -e $rep);
    }

  6. #6
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par djibril Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my @repertoires = ("C:/toto/tutu",
                      "C:/test/2007/10/23",
                      "C:/test/2007/10",
                      "C:/test",
                      "C:/test/2007");
    foreach my $rep (sort @repertoires) {
      mkdir ("$rep", 0755) or warn("$rep pas cree\n") unless(-d $rep and -e $rep);
    }
    oui, merci, j'ai effectivement inversé le die/warn et le unless dans mon premier message: c'est pour cela que ça ne marchait pas

    Par contre, je me demandais quelles étaient les règles qui s'appliquent aux or/if/unless ?

    Dans ton exemple, on lit créer le dossier "..." ou plante si la création du dossier est impossible sauf s'il existe déjà

    alors que l'action réalisée est : créer le dossier "..." sauf s'il existe déjà ou plante si la création du dossier est impossible (bien qu'il n'existe pas)

    En gros, pourquoi le unless conditionne-t-il le mkdir et pas le warn ?

    Edit: en fait, j'ai l'impression que le unless conditionne bien le warn

    Si je reprends le code en modifiant juste ce passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir ("$rep", 0755) or warn("$rep pas cree\n") unless(-e $rep);
    Alors, si j'ai un fichier qui existe déjà avec le nom du répertoire, ça ne marche plus :'(
    Le mkdir plante, mais le warn ne se fait pas puisque le unless est vérifié (il s'agit d'un fichier et non d'un répertoire, mais je ne le teste plus !)

  7. #7
    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 : 499 184
    Points
    499 184
    Par défaut
    non tu te trompes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir ("$rep", 0755) or warn("$rep pas cree\n") unless(-d $rep and -e $rep);
    equivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unless(-d $rep and -e $rep) {
      mkdir ("$rep", 0755) or warn("$rep pas cree\n");
    }
    Donc en gros ça veut dire :
    sauf si $rep est un repertoire et existe, cree moi le repertoire $rep ou bien affiche moi un warning si tu n'arrive pas à creer le repertoire.
    Le unless s'applique à mkdir et warn s'applique en cas d'echec de mkdir.

  8. #8
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par djibril Voir le message
    non tu te trompes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir ("$rep", 0755) or warn("$rep pas cree\n") unless(-d $rep and -e $rep);
    equivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unless(-d $rep and -e $rep) {
      mkdir ("$rep", 0755) or warn("$rep pas cree\n");
    }
    Donc en gros ça veut dire :
    sauf si $rep est un repertoire et existe, cree moi le repertoire $rep ou bien affiche moi un warning si tu n'arrive pas à creer le repertoire.
    Le unless s'applique à mkdir et warn s'applique en cas d'echec de mkdir.
    ahhh oui, bien sûr... le unless en post-condition s'applique donc à l'ensemble de ce qui le précède et pas uniquement à tel ou tel élément...

    Bon, ok, je pense que j'ai compris là désolé pour le dérangement

    Perl, c'est sympa, mais des fois, y'a tellement de moyen de faire un truc qu'on a du mal à s'y retrouver

    Edit: merci beaucoup pour tes explications

  9. #9
    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 : 499 184
    Points
    499 184
    Par défaut
    le conseil que je peux te donner est d'eviter les ecriture à rallonge sur une seule ligne car c'est pas tres lisible et tres prise de tete pour la maintenabilité d'u n code.
    autant juste faire des imbrications.
    Les seuls fois où il peut etre interessant de faire en une ligne est pendant l'utilisation de last, redo ou next car on voit tout de suite ce qu'on veut faire.
    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TOTO:
    foreach my $case (@tableau) {
      last TOTO if($case =~ /condition/);
    }
    sera preferable à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TOTO:
    foreach my $case (@tableau) {
     if($case =~ /condition/) {
       last TOTO;
     }
    }
    et encore plus preferable à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TOTO:
    foreach my $case (@tableau) {
     unless($case !~ /condition/) {
       last TOTO;
     }
    }

  10. #10
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    hehe =) oui, je suis d'accord.

    Mais comme je l'ai expliqué, c'était plus à but "pédagogique" qu'autre chose que je cherchais à faire ça... je ne comprenais pas pourquoi, mais maintenant, c'est bon :p

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

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