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 :

Print seulement si différent de 0


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut Print seulement si différent de 0
    Salut,

    Désolé pour le titre mais je sais pas trop comment condenser ça
    Bref, voilà ce que j'aimerais faire.

    J'ai cette fonction :

    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
    sub M2DHM {
    	my $minutes = shift;
    	chomp $minutes;
     
    	#	Si les minutes retournées par mencoder sont égales à 0, alors on retourne 'estimation en cours' 
    	if ( $minutes eq 0 ) {
    		return ( sprintf 'Estimation en cours');
    	}
     
    	# Si c'est pas égal à 0, alors calcul
    	else {
    		my $jours = int($minutes/1440);
    		$minutes -= $jours * 1440;
    		my $hours = int($minutes/60);
    		$minutes -= $hours * 60;
    		# TODO : n'afficher que ce qui est différent de zero
    		return sprintf '%02d jour(s), %02d heure(s) et %02d minute(s)', $jours, $hours, $minutes;
    	}
    }
    Qui me permet de convertir des minutes en jours, heures minutes.
    Je l'appelle dans mon script de cette mannière :

    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
    my $video_encod = new IO::Pipe(); 
    	$video_encod->reader("mencoder -nosound -dvd-device /home/jerome/VIDEO_TS dvd://1 -vf crop=720:576:0:0 -of rawvideo -ovc x264 -x264encopts bitrate=1000:pass=1:subq=4:8x8dct:me=dia:frameref=5:bframes=2:b_pyramid:weight_b:direct_pred=auto:partitions=all:qcomp=0.75:ip_factor=1.10:pb_factor=1.40 -o /dev/null");
    	{ 
    		local $/ = "\r";
    		my $runtime;
    		while( defined( my $line = $video_encod->getline ) ) {
    			#	Pour info (pourcentage) $1 = '((\s{0,1}\d+%)\)', (fps) $2 = '([\d\.]+s)' et (temps restant) $3 = '(\d+)'
    			#	Ligne de mencoder lors du lancement :
    			# Pos:   0.0s      1f ( 0%)  0.00fps Trem:   0min   0mb  A-V:0.000 [0:0]
    			if ( $line =~ m/Pos:\s{0,3}?[\d\.]+s\s{0,6}?\d+f\s{1}?\((\s{0,1}\d+%)\)\s{0,2}?([\d\.]+)fps\s{1}?Trem:\s{0,3}?(\d+)min.*$/ ) {
    				$runtime = M2DHM($3); # Utilisation de la fonction calcul m > j:h:m
    				print "       Temps restant : $runtime, $1 terminé, Vitesse : $2 fps\r";
    			}
    			else {
    				print "       Estimation en cours ...\r";
    			}
    		}
    	}
    Voilà ce que ca donne dans mon shell :

    Temps restant : 00 jour(s), 00 heure(s) et 58 minute(s), 0% terminé, Vitesse : 21.88 fps
    J'aimerais un petit coup de main pour que la fonction ne retourne pas les jours si ceux-ci sont égales à 0 et ainsi de suite.
    Par exemple si jours = 0 et heures = 0 alors :

    Temps restant : 58 minute(s), 0% terminé, Vitesse : 21.88 fps
    Merci d'avance
    A noter que j'avais déjà essayer avec des if / elsif mais c'est un joli bordel


    Jjeje007

  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
    Ben tu es comme même obligé d'utiliser des if, par exemple :
    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
    sub M2DHM {
    	my $minutes = shift;
    	chomp $minutes;
    	my $result;
     
    	#	Si les minutes retournées par mencoder sont égales à 0, alors on retourne 'estimation en cours' 
    	if ( $minutes eq 0 ) {
    		$result = 'Estimation en cours';
    	}
     
    	# Si c'est pas égal à 0, alors calcul
    	else {
    		my $jours = int($minutes/1440);
    		$minutes -= $jours * 1440;
    		my $hours = int($minutes/60);
    		$minutes -= $hours * 60;
    		$result .= sprintf '%02d jour(s) ', $jours if $jours;
    		$result .= sprintf '%02d heure(s) ', $heures if $heures;
    		$result .= sprintf '%02d minute(s)', $minutes if $minutes;
    	}
     
    	return $result;
    }
    Bon ça ne sera pas aussi joli (pas de "et" ou de virgules), mais c'est relativement simple, sinon tu devras effectivement en passer par des elsif.

    Sinon tu peux faire un truc plus intelligent, comme par exemple :
    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
    no warnings 'numeric';
     
    sub format_list (&@) {
      my ($block, @elems) = @_;
      my $result;
      @elems = grep {$block->($_)} @elems;
     
      splice @elems, 0, $#elems, (join ', ', @elems[0..($#elems-1)]) if @elems > 2;
      $elems[$#elems - 1] .= ' et ' if @elems > 1;
     
      return join '', @elems;
    }
     
    sub M2DHM {
    	my $minutes = shift;
    	chomp $minutes;
    	my $result;
     
    	# Si les minutes retournées par mencoder sont égales à 0, 
    	# alors on retourne 'estimation en cours' 
    	if ( $minutes eq 0 ) {
    		return 'Estimation en cours';
    	}
     
    	# Si c'est pas égal à 0, alors calcul
    	else {
    		my $jours = sprintf '%02d jour(s)', int($minutes/1440);
    		$minutes -= $jours * 1440;
    		my $hours = sprintf '%02d heure(s)', int($minutes/60);
    		$minutes -= $hours * 60;
    		$minutes = sprintf '%02d minute(s)', $minutes;
     
    		return format_list {$_+0} ($jours, $hours, $minutes);
    	}
    }
    Et c'est joli à nouveau.

    --
    Jedaï

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Merci

    Juste une question par rapport à ça :

    Cela va-t-il s'appliquer à tout mon programme ?
    Ou si je le mets seulement dans la fonction M2DHM, ca ne s'appliquera que dans celle-ci ?

    Jjeje007

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Citation Envoyé par Jjeje007 Voir le message
    Merci

    Juste une question par rapport à ça :

    Cela va-t-il s'appliquer à tout mon programme ?
    Ou si je le mets seulement dans la fonction M2DHM, ca ne s'appliquera que dans celle-ci ?

    Jjeje007
    Ok, j'ai trouvé la réponse : Si je le mets seulement dans la fonction M2DH alors le "no warnings" ne s'appliquera qu'a celle-ci (enfin d'après ce que j'en ai compris )

    Jjeje007

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Pour être précis, ton no warning aura une portée lexicales, il sera donc limité au bloc où tu l'auras mis

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/04/2010, 10h52
  2. window.print() imprime seulement une page sous FireFox
    Par djolof dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 09/09/2009, 14h49
  3. Réponses: 5
    Dernier message: 12/03/2009, 17h59
  4. Réponses: 5
    Dernier message: 24/11/2008, 15h07
  5. Print différent de Preview
    Par defluc dans le forum QuickReport
    Réponses: 5
    Dernier message: 07/09/2007, 12h14

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