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 :

modifier handle fichier


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut modifier handle fichier
    Bonsoir á tous,

    Est t il possible de modifier un handle de fichier ?

    Je parcours un fichier binaire et selon la donnée reçue, je dois lire les x données qui suivent.

    j'ai essayé de passer directement le handle via une variable dans ma sous routine puis d'updater le handle d'origine après mais cela ne passe pas.
    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
     
    ...
    while (<FIC>){
             $value = $_;  
             $fic     = FIC;
             switch($timer_choice){
             case 0 {}
             case 1 {FIC = &func_timer_1($fic)}
             case 2 {FIC = &func_timer_2($fic)}
             case 3 {FIC = &func_timer_3($fic)}
             else   {}
           }
    }
     
    sub func_timer_1{
      $ficTemp = $_[0];
      $timer     = <$ficTemp>;
      print "   - timer 1   : $timer\n"; 
      return $ficTemp;
    }

    Le probleme est que selon les timers choisis il y a plusieurs données á lire (1 pour le 1, 2 pour le 2 et 3 pour le 3) donc il faut que j'update en sortie de sous routine le handle utilisé dans la boucle while.

    Merci d'avance,

    guillaume

  2. #2
    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
    Je rappelle qu'utiliser switch() en Perl est rarement une bonne idée (sauf si on est en 5.10 et qu'on peut utiliser given()...when() ) ... Ici par exemple un tableau de fonction devrait avantageusement le remplacer.

    Par ailleurs ça fait un moment que l'on peut utiliser des variables lexicales plutôt que des globs pour contenir les handles de fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open my($file), '<', $filename
      or die "Error opening $filename : $!\n";
     
    while( <$file> ) {
      # blabla
      function( $file );
      # blabla
    }
    Cela présente de nombreux avantages (fermeture automatique lorsque le fichier n'est plus référencé, syntaxe plus régulière, handle localisé automatiquement ...) et est donc recommandé à partir du moment où on a un Perl assez récent (5.8, disponible depuis plus de 6 ans maintenant).

    Sinon, pour passer un glob à l'ancienne à une fonction, il faut faire quelque chose comme :
    --
    Jedaï

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Bonjour,

    merci pour cette réponse cela fonctionne parfaitement.

    Concernant le switch, pourquoi est ce déconseillé ?
    Je peux passer par des conditions mais cela fait vite brouillon.
    Peux tu m'expliquer ce que tu sous entends par tableau de fonction ?

    Je pourrais selon la valeur de mon choix aller taper dans une table á l'index choix mais pour que cette case du tableau contienne mon:
    FIC = &func_timer_1(FIC)
    je ne vois pas.

    Merci d'avance

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Je suis en 5.10 mais je n'avais pas testé mon switch, il semblerait que seulement la première entrée soit possible..
    Pour l'instant je suis passé par une suite d'if-elsif..

  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
    switch() n'existe pas en Perl, given() when() est une syntaxe introduite en 5.10 plus puissante qu'un switch(), ton script devrait être écrit :
    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
    #!/usr/bin/perl
    use strict; use warnings;
    use feature ":5.10";
     
    my $filename = "blabla";
    my $timer_choice = 1;
     
    open my($file), '<', $filename
      or die "Opening $filename : $!\n";
     
    while (my $value = <$file>){
      given ($timer_choice){
        when(1){ func_timer_1($file) }
        when(2){ func_timer_2($file) }
        when(3){ func_timer_3($file) }
      }
    }
     
    close $file;
     
    #blabla
     
    sub func_timer_1 {  
      $temp_file = shift;
      $timer     = <$temp_file>;
      say "   - timer 1   : $timer";
    }
     
    __END__
    (inutile de renvoyer le handle, un handle sait toujours où il en est dans le fichier, pas besoin de le "mettre à jour")

    Sinon, une façon de faire sans given(), et donc compatible avec la plupart des Perl est d'utiliser un tableau de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @timer_functions = (undef, \&funct_timer_1, \&func_timer_2, \&func_timer_3);
     
    while (my $value = <$file>){
      if( 0 < $timer_choice && $timer_choice < @timer_functions) {
        $timer_functions[$timer_choice]->($file);
      }
    }
    --
    Jedaï

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/02/2012, 11h57
  2. [JexcelAPI]Modifier un fichier excel
    Par sissi_l dans le forum Documents
    Réponses: 3
    Dernier message: 01/06/2007, 01h36
  3. [jar] Comment modifier un fichier jar
    Par newfsch dans le forum JBuilder
    Réponses: 5
    Dernier message: 18/07/2004, 14h25
  4. Handle -> fichier *.exe associé ?
    Par Neilos dans le forum Windows
    Réponses: 6
    Dernier message: 27/04/2004, 18h22
  5. [LG]modifier un fichier
    Par fofovi72 dans le forum Langage
    Réponses: 3
    Dernier message: 15/04/2004, 21h30

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