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 :

commande msdos "copy" dans Perl


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut commande msdos "copy" dans Perl
    Bonjour,

    J'ai ajouter dans mon script Perl une concatenation de plusieurs fichiers *.log en un seul et unique fichier log mais je ne connais pas du tout la syntaxe à employer.
    Je suis novice en Perl
    J'aimerais faire ceci :
    "copy info_*.log Global.log" --> créer un fichier Global.log avec tous les fichiers commençant par Info_*.log

    Pouvez vous m'aider ?

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Peut-être quelque chose de ce genre
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    use File::Copy;
     
     
    open my $fh_out, '>>', "DIR/Global.log" or die $!;
     
    my $file_list = glob("DIR/Info_*.log ");
     
     
    foreach my $file ( $file_list ){ 
    	copy($file,$fh_out) or die "Copy failed: $!";
    }
     
    close $fh_out;
    Si tu as beaucoup de fichier log, il vaut mieux utiliser opendir() que glob().

    CPAN File::Copy
    L'ennui est qu'il est déconseillé d'utiliser des filehandles avec ce module, mais je ne sais pas comment faire d'autre.

    Sous quel OS es-tu? N'existe-il pas une fonction que tu pourrais exécuter via la fonction system() de perl?

  3. #3
    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 Jasmine80 Voir le message
    CPAN File::Copy
    L'ennui est qu'il est déconseillé d'utiliser des filehandles avec ce module, mais je ne sais pas comment faire d'autre.
    Note that passing in files as handles instead of names may lead to loss of information on some operating systems; it is recommended that you use file names whenever possible.
    Ne t'inquiète pas, le seul risque lié à l'emploi de filehandles plutôt que de fichier, c'est la perte d'information comme les droits sur le fichier, les ACL, certaines statistiques, etc... Je doute que ce problème se pose dans notre cas en particulier.

    --
    Jedaï

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut
    [QUOTE=Jasmine80;4591477]Peut-être quelque chose de ce genre
    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
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    use File::Copy;
     
     
    open my $fh_out, '>>', "DIR/Global.log" or die $!;
     
    my $file_list = glob("DIR/Info_*.log ");
     
     
    foreach my $file ( $file_list ){ 
    	copy($file,$fh_out) or die "Copy failed: $!";
    }
     
    close $fh_out;

    Merci beaucoup
    ca marche cependant j'ai voulu ajouté la date du jour (voir ci-contre)
    my $thisdate = strftime("%Y-%m-%d", localtime());
    my $file_list = glob("DIR/Info_$thisdate_*.log ");

    mais je pense que j'ai un problème de syntaxe

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par calimerojeff Voir le message
    ca marche cependant j'ai voulu ajouté la date du jour (voir ci-contre)
    my $thisdate = strftime("%Y-%m-%d", localtime());
    my $file_list = glob("DIR/Info_$thisdate_*.log ");

    mais je pense que j'ai un problème de syntaxe
    Utilise les pragma strict et warnings.
    'Strict' renvoie l'erreur 'Global symbol "$thisdate_" requires explicit package ' car l'underscore colle au bout de ta variable.

    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $file_list = glob("DIR/Info_$thisdate"."_*.log ");

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Utilise les pragma strict et warnings.
    'Strict' renvoie l'erreur 'Global symbol "$thisdate_" requires explicit package ' car l'underscore colle au bout de ta variable.

    Essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $file_list = glob("DIR/Info_$thisdate"."_*.log ");

    HELP ME
    C'est incroyable !!!!! le programme ne focntionne plus.
    je t'avais dit que c'etait ok ya un moment et maintenant ca ne marche plus :
    Il ne traite que mon 1er fichier log

    Voici mon programme :
    use strict;
    use warnings;
    use File::Copy;
    open my $fh_out, '>>', "S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Global.log" or die $!;
    my $file_list = glob( "S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Info"."_*.log" );
    foreach my $file ( $file_list )
    {
    copy($file,$fh_out) or die "Copy failed: $!";
    }
    close $fh_out;

    J'ai 5 fichiers log à compiler dans un seul (global.log)

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    Essaye de debugger via 2-3 instructions print:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use strict;
    use warnings;
    use File::Copy;
    open my $fh_out, '>>', "S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Global.log" or die $!;
    my $file_list = glob( "S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Info"."_*.log" );
    print "Ma liste : ".$file_list."\n";
    foreach my $file ( $file_list )
    {
    print "Traitement du fichier ".$file." pour une copie vers ".$fh_out."\n";
    copy($file,$fh_out) or die "Copy failed: $!";
    }
    close $fh_out;

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut
    Citation Envoyé par 50Nio Voir le message
    Essaye de debugger via 2-3 instructions print:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    use strict;
    use warnings;
    use File::Copy;
    open my $fh_out, '>>', "S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Global.log" or die $!;
    my $file_list = glob( "S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Info"."_*.log" );
    print "Ma liste : ".$file_list."\n";
    foreach my $file ( $file_list )
    {
    print "Traitement du fichier ".$file." pour une copie vers ".$fh_out."\n";
    copy($file,$fh_out) or die "Copy failed: $!";
    }
    close $fh_out;
    En ajoutant tes "print", je remarque que le programme ne prend qu'en compte juste le 1er fichier "Info".Info"."_*.log"
    resultat :
    1er print
    Ma liste : S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot V3D/0180/Info_2009-09-03_[proce09i3].log
    2eme print
    Traitement du fichier S:/SVG/UTILITAIRES/DVDProfessionnel/DOCUMENTS/PSA/Mars_ilot/V3D/0180/Info_2009-09-03_[proce09i3].log pour une copie vers GLOB(0x15d53e0)

    La grande question est POURQUOI
    LOL c'est incompréhensif

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    En fait c'est "simple", la fonction glob te retourne une liste, pas une valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my @file_list = glob( "/tmp/*.*" );
    print Dumper(@file_list);
    foreach my $file ( @file_list )
    {
    print "Traitement du fichier ".$file." \n";
    }
    Le Perl est très permissif au niveau des variables, y compris des déclarations. Dans ton cas il accepte de mettre un résultat liste dans une variable simple, mais du coup tu perds tous les autres éléments.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Par défaut
    Citation Envoyé par 50Nio Voir le message
    En fait c'est "simple", la fonction glob te retourne une liste, pas une valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my @file_list = glob( "/tmp/*.*" );
    print Dumper(@file_list);
    foreach my $file ( @file_list )
    {
    print "Traitement du fichier ".$file." \n";
    }
    Le Perl est très permissif au niveau des variables, y compris des déclarations. Dans ton cas il accepte de mettre un résultat liste dans une variable simple, mais du coup tu perds tous les autres éléments.
    Je suis un novice en Perl
    j'ai une erreur à cause de "Dumper" ( Undefined subroutine &main:umper)
    Comment la déclarer please ?

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    C'est juste une astuce pour débogage.

Discussions similaires

  1. Mettre resultat commande MSDOS dans variable
    Par vpovpo dans le forum Windows
    Réponses: 1
    Dernier message: 05/01/2007, 17h09

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