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

Modules Perl Discussion :

Decompression d'un fichier sans utiliser les modules du CPAN


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Points : 32
    Points
    32
    Par défaut Decompression d'un fichier sans utiliser les modules du CPAN
    Bonjour,

    Je dois décompresser un fichier zip à partir d'un programme perl.
    Je n'ai malheureusement pas à ma disposition de module du CPAN me permettant de réaliser cette décompression (pour plusieurs raisons, je n'ai pas la possibilité d'installer l'un de ces modules).

    J'utilise donc une commande de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @resultat = `gunzip -S .zip monFichier.zip`;
    Celal fonctionne correctement, sauf si quelque chose se passe mal (le fichier n'existe pas, n'est pas au format zip ....).
    Comment tester si quelque chose s'est mal passé :

    Merci de vos réponses

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Salut !

    Essai avec un bloc eval contenant un system() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eval {
    system("gunzip -S .zip monFichier.zip");
    } or warn "Impossible\n";
    Je pense que ceci fonctionne, l'eval permettant l'error trapping.

    Bon code
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 44
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Merci pour ta réponse, mais ça ne fonctionne pas top, elle fait exactement l'inverse de ce qu'on attend d'elle (cela m'affiche "impossible" dès que la décompression est réussie).

    J'ai trouvé une autre solution qui semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $res = `gunzip -S .zip monFichier.zip`;
    $res = `echo $?`;
    chomp ($res);
    print "Décompression impossible \n" if $res ne '0';
    Ce que je ne suis pas sur, c'est de savoir si `echo $?` ne me renverra jamais '0' si il y a une erreur. Quelqu'un a-t-il la réponse?

    @+

  4. #4
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par choubiroute
    Bonjour,

    Merci pour ta réponse, mais ça ne fonctionne pas top, elle fait exactement l'inverse de ce qu'on attend d'elle (cela m'affiche "impossible" dès que la décompression est réussie).

    J'ai trouvé une autre solution qui semble fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $res = `gunzip -S .zip monFichier.zip`;
    $res = `echo $?`;
    chomp ($res);
    print "Décompression impossible \n" if $res ne '0';
    Ce que je ne suis pas sur, c'est de savoir si `echo $?` ne me renverra jamais '0' si il y a une erreur. Quelqu'un a-t-il la réponse?

    @+
    Il vaut mieux faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $res = `gunzip -S .zip monFichier.zip`;
    print "Décompression impossible \n" if $? != 0;
    $? est une variable Perl qui contient le code d'erreur du dernier sous-processus lancé (donc fork(), system(), ``). Si le code d'erreur renvoyé par gunzip est différent de 0, cela indique une erreur.

    --
    Jedaï

  5. #5
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    NB : S'il s'agit seulement de décompresser et que tu n'as pas besoin de la sortie de la commande 'gunzip', tu peux directement utiliser system() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    system("gunzip -S .zip monFichier.zip")
      and warn "Impossible\n";
    (le eval est inutile ici, et exceptionnellement on doit utiliser un 'and' plutôt qu'un 'or' pour le contrôle d'erreur, parce que system renvoie 0 (valeur fausse) en cas de succès, alors que les autres fonctions renvoient plutôt une valeur vraie en cas de succès).

    --
    Jedaï

  6. #6
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Oups, autant pour moi, un petit oubli de ma part, l'habitude de contrôler les erreurs avec un or die ou un or warn...

    Désolé !
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par Woufeil
    Essai avec un bloc eval contenant un system() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eval {
    system("gunzip -S .zip monFichier.zip");
    } or warn "Impossible\n";
    Ca ne peut pas fonctionner à cause d'un "piège à con":
    l'eval renvoie la valeur renvoyée par le system. Hors, une commande système renvoie 0 en cas de succes; et autre chose en cas de probleme.

    En cas de probleme, le system renvoie une valeur true, et le "or warn" n'est donc pas exécuté. Il faut donc mettre "and warn".

    De plus, le bloc eval ne sert ici a rien, car un system à problème ne fera pas planter ton script.

    C'est donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("gunzip -S .zip monFichier.zip") and warn "Impossible\n";
    Michaël Hooreman

Discussions similaires

  1. Recherche dans un fichier sans utiliser les Jet drivers ?
    Par kueisaho dans le forum VBScript
    Réponses: 1
    Dernier message: 05/03/2007, 18h09
  2. Upload et download de fichier sans utiliser JSP
    Par RR instinct dans le forum Langage
    Réponses: 8
    Dernier message: 30/08/2006, 12h08
  3. Inclure un fichier externe sans utiliser les frames
    Par gazza dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/07/2006, 08h52
  4. Réponses: 9
    Dernier message: 01/07/2006, 20h04

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