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 :

Passage de fichiers a un sub


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut Passage de fichiers a un sub
    Salut,

    Je fais un petit script pearl qui prend n parametres. Les n-1 premiers sont des fichiers a traiter, le dernier parametre etant le fichier dans lequel je veux ecrire des statistiques sur le contenu de fichier.
    typiquement :
    gen_data.pl file1 file2 file3 out_file

    Dans mon gen_data.pl, je veux faire le meme traitement pour mes fichiers d'entre, d'ou mon idee d'utiliser sub. Malheureusement je n'arrive pas a passer corectement les file handle de mes fichiers d'entree a mon procedure sub.
    J'ai donc du tmeporairement dupliquer la meme tache.
    Mon script donne donc :
    #!/global/local/2003.01/bin/perl
    open(input1,@ARGV[0]) || die "Could not open @ARGV[0]";
    open(input2,@ARGV[1]) || die "Could not open @ARGV[1]";
    open(input3,@ARGV[2]) || die "Could not open @ARGV[2]";
    open(output,">@ARGV[3]");


    while (<input1>) {
    chomp;
    if (/^Pin/) {$debut = 1;next}
    if ($debut==1) {
    if (/^----.*/) {next}
    if (/^1/) {next}
    @mot = split(/[ ]+/,$_);
    $point = $mot[0] . " " .$mot[1];
    $coverage{$point}{1} = $mot[4];
    $coverage{$point}{nbr}++;
    }
    }

    $debut=0;
    while (<input2>) {
    chomp;
    if (/^Pin/) {$debut = 1;next}
    if ($debut==1) {
    if (/^----.*/) {next}
    if (/^1/) {next}
    @mot = split(/[ ]+/,$_);
    $point = $mot[0] . " " .$mot[1];
    $coverage{$point}{2} = $mot[4];
    $coverage{$point}{nbr}++;
    }
    }

    $debut=0;
    while (<input3>) {
    chomp;
    if (/^Pin/) {$debut = 1;next}
    if ($debut==1) {
    if (/^----.*/) {next}
    if (/^1/) {next}
    @mot = split(/[ ]+/,$_);
    $point = $mot[0] . " ". $mot[1];
    $coverage{$point}{3} = $mot[4];
    $coverage{$point}{nbr}++;
    }
    }

    Pas tres elegant et portable.
    J'aimerai plutot faire :
    #!/global/local/2003.01/bin/perl
    open(input1,@ARGV[0]) || die "Could not open @ARGV[0]";
    open(input2,@ARGV[1]) || die "Could not open @ARGV[1]";
    open(input3,@ARGV[2]) || die "Could not open @ARGV[2]";
    open(output,">@ARGV[3]");


    sub cover {
    while (@_) {
    chomp;
    if (/^Pin/) {$debut = 1;next}
    if ($debut==1) {
    if (/^----.*/) {next}
    if (/^1/) {next}
    @mot = split(/[ ]+/,$_);
    $point = $mot[0] . " " .$mot[1];
    $coverage{$point}{1} = $mot[4];
    $coverage{$point}{nbr}++;
    }
    }

    %coverage = cover(input1);
    %coverage = cover(input2);
    %coverage = cover(input3);

    Malheureusment, je n'y arrive pas.

    Comment faire pour que je puisse passer mes differents fichiers comme argument de ma procedure ?

    Merci pour l'aide.

  2. #2
    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
    Pas très élégant effectivement...

    Une méthode simple :
    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
     
    #!/global/local/2003.01/bin/perl
    use strict; use warnings;
     
    my %coverage;
     
    foreach my $idx ( 0..($#ARGV - 1) ){
        open my $input, '<', $ARGV[$idx]
            or die "Impossible d'ouvrir $ARGV[$idx] en lecture : $!\n";
        cover( $input, \%coverage );
    }
     
    sub cover {
        my ($handle, $covref) = @_;
        my $debut = 0;
        while (<$handle>) {
            chomp;
            if ( /^Pin/ ) {
                $debut = 1;
                next;
            }
            if ( $debut ) {
                next if (/^----.*/);
                next if (/^1/);
                my @mot = split(/ +/,$_);
                my $point = $mot[0] . " " .$mot[1];
                $covref->{$point}{1} = $mot[4];
                $covref->{$point}{nbr}++;
            }
        }
    }
     
    open my $output, '>', $ARGV[-1]
        or die "Impossible d'ouvrir $ARGV[-1] en écriture : $!\n";
     
    # Faire ses sorties ?
     
    __END__
    J'utilise ici des handles lexicaux, c'est plus propre et plus puissant comme approche. Par ailleurs j'ai ajouté "use strict; use warnings;", c'est une très bonne habitude à prendre.

    --
    Jedaï

    PS : A partir de maintenant, essaie de prendre l'habitude de mettre ton code entre balises "code" (tu peux utiliser le bouton # dans l'interface du forum pour ça).

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut
    Merci.
    C'est bien mieux comme cela

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

Discussions similaires

  1. [Débutant] passage de tableau en paramètre (sub ou classe)
    Par patrickvier dans le forum VB.NET
    Réponses: 1
    Dernier message: 24/10/2012, 17h08
  2. Passages de fichiers LaTeX de Win à Mac
    Par Celadon dans le forum Editeurs / Outils
    Réponses: 5
    Dernier message: 15/01/2011, 12h15
  3. Passage de fichier temporaire entre deux JCLs
    Par Kyle Katarn dans le forum JCL - SORT
    Réponses: 3
    Dernier message: 20/02/2009, 16h24
  4. ouverture de dossier/fichier dans un sub
    Par apprenti doc dans le forum Langage
    Réponses: 11
    Dernier message: 09/05/2007, 21h18
  5. passage de paramètres à un fichier SQL
    Par philfont dans le forum Administration
    Réponses: 5
    Dernier message: 30/08/2004, 15h01

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