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 :

Jauge d'avancement simple


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut Jauge d'avancement simple
    Bonjour à tous , question qui parait simple , mais est ce que quelqu'un à déjà fait une "jauge" toute bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $nb = 100;
    @tab = (1..$nb) ;
     
    foreach ( @tab ) {
    	$val = $_ / $nb *20;
    	$ent = int ( $val ) ;
    	if ( $ent != $ent_prec ) {
    		print "-" ;
    		$ent_prec = $ent ;
    		sleep 1 ;
    	}
    }
    Parce que ça ne marche pas , ça m'affiche tous les "=" dès le foreach terminé , mais pas pendant ??? Quelle en est la raison ?

    Merci

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,
    si tu veux juste une barre de progression, tu peux utiliser les modules pré existants tel ProgressBar

    sinon le mécanisme que tu recherches est le flush, les données sont gardées en mémoire et ne sont écrites que quand les conditions sont rencontrées (fin de ligne par exemple), ce qui n'est probablement pas le cas dans ton exemple avant la fin du script.

    tu peux modifier ce mécanisme avec la variable $| (voir perlvar)
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Bon
    j'ai regardé ça , mais c'est un peu complexe , juste pour faire un print "=" ...

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    c'est essentiellement pour des raisons de performances. En fonctionnement normal, si l'ordinateur devait faire un appel système pour chaque caractère que tu écris, ce serait extrêmement lent et insupportable. Donc Perl "bufférise" ce que ton programme écrit (en gros, il n'écrit que des lignes entières à l'écran et que des groupes de lignes dans un fichier). Il faut donc forcer l'écriture (sans bufférisation) pour résoudre le problème.

    Pour cela, il suffit d'ajouter ceci: $| = 1; à ton code au bon endroit pour que tu obtiennes ce que tu veux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $nb = 100;
    @tab = (1..$nb) ;
     
    foreach ( @tab ) {
    	$val = $_ / $nb *20;
    	$ent = int ( $val ) ;
    	if ( $ent != $ent_prec ) {
    		$| = 1;
    		print "-" ;
    		$ent_prec = $ent ;
    		sleep 1 ;
    	}
    }
    (Je viens d'essayer, ça marche comme prévu.)

    Rien de bien complexe, en définitive.

    Pour plus d'information, voici un excellent article (en anglais) de Mark Jason Dominus sur le sujet: https://perl.plover.com/FAQs/Buffering.html.

  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
    Bonsoir,

    La méthode la plus simple, efficace, fonctionnelle est l'utilisation du module Term::ProgressBar.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use Term::ProgressBar;
     
    my $progress = Term::ProgressBar->new(25);
     
    for (0..25) {
       $progress->update($_);
       sleep 1;
    }

  6. #6
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Merci pour vos réponses , je vais tester la solution de Lolo78 des demain , ne pouvant installer de modules ....

  7. #7
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Impec , pile poil ce qu'il me fallait , ça marche !!!

    Merci Lolo78

  8. #8
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Juste une remarque, l'utilisation de STDOUT pour observer l'avancement n'est pas idéale car elle interdit la redirection standard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl -E '++$|; for (1 .. 30) { print "*" unless $_ % 10; $res += $_; sleep 1} say $res' > resultat.txt
    $ cat resultat.txt
    ***465
    $
    Il vaut mieux utiliser STDERR, qui n'est incidemment pas bufferisé (et donc pour lequel on n'a pas besoin de jouer sur $|) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl -E 'for (1 .. 30) { print STDERR "*" unless $_ % 10; $res += $_; sleep 1} say $res' > resultat.txt
    ***$ cat resultat.txt
    465
    $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

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

Discussions similaires

  1. pagination avancée simple
    Par dancom5 dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2017, 09h34
  2. Réponses: 3
    Dernier message: 21/03/2008, 09h45
  3. Réponses: 0
    Dernier message: 25/01/2008, 10h09
  4. question simple pour application avancée
    Par anasouth dans le forum Linux
    Réponses: 4
    Dernier message: 26/06/2007, 16h38
  5. Aide Pour Requete SQL Simple ... Merci d'avance :)
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2005, 11h39

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