[PERL] boucle While (debutant)

rikki -  
 rikki -
Bonjour,

Je cherche a faire un petit script qui demarre une action a 58 seconde pile.
Or il apparait que ma variable $seconde ne s'evalue pas dans la boucle.

my ($secondes) = localtime(time);
while( $secondes < 58 )
{
print "$secondes\n";
my ($secondes) = localtime(time);
}

Autre question.
Peut on, sinon , mettre un mini sleep pour attenuer l'occupation processeur.
Jai vu qu'on peut mettre un sleep, mais celui ci est d1 seconde minimum et je risque donc de rater mon 58 seconde pile (ou le plus pile possible). Je ne souhaite pas utiliser le planificateur de tache ou cron pour des raisons de latence..
Merci
Configuration: Windows XP
Internet Explorer 7.0

8 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    la boucle tourne plusieurs fois dans la même seconde, essayer d'ajouter un sleep:
    my ($secondes) = localtime(time);
    while( $secondes < 58 )
    {
    print "$secondes\n";
    sleep 1 ;
    my ($secondes) = localtime(time);
    } 


    utiliser usleep
    For delays of finer granularity than one second, the Time::HiRes module (from CPAN, and starting from Perl 5.8 part of the standard distribution) provides usleep(). You may also use Perl's four-argument version of select() leaving the first three arguments undefined, or you might be able to use the syscall interface to access setitimer(2) if your system supports it. See perlfaq8 for details.
    0
  2. rikki
     
    Merci bien..
    Je crois que je vais adopter cette solution ..
    0
  3. rikki
     
    oups!

    Je viens de tester le script .
    La probleme reste toujours un peu le meme, la variable $seconde ne reprend pas de nouvelle valeur dans la boucle while de la seconde en cours..
    Ainsi avec ton script comme sortie j'ai
    16
    16
    16
    16

    alrors que dans mon idée je devrais avoir avec un sleep d'une seconde

    16
    17
    18
    19

    si tu vois quelque chose
    thx !
    ++
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    c'est normal tu affiche la seconde avant le sleep ;-)
    lami20j@debserv:~$ vi sec.pl
    #!/usr/bin/perl
    use strict;use warnings;
    
    my ($secondes) = localtime(time);
    while( $secondes < 58 )
    {
            sleep 1 ;
            ($secondes) = localtime(time);
            print "$secondes\n";
    }
    __END__

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    et sans le my
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      le 1er oui ;-) à cause de pragmas use strict;use warnings;
      0
  7. rikki
     
    Oui merci ..
    Ca marche ..
    Je ne sais pas pourquoi je dois ne pas reutiliser my ..
    Je sais , que je suis pas tres bon ..lol :-)
    Il n'empeche que grace a vous et a Lami20j j'ai quelques scripts qui tournent en batch...

    Merci , a l'occasion de cette reponse un merci a tous les contribueurs PERL donc :-) pour les pauvres debutants que nous sommes..

    je vais essayer dutiliser usleep , apres en avoir bavé hier pour installer une librairie autre..
    Menfin c'est le metier qui rentre.
    Sinon j'ai vu quil existait la fonction alarm qui a priori declenche une action a une seconde donnée..
    a plus ++
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Quand tu déclare au début my ($secondes) il s'agit d'une variable locale au paquetage
    La variable est transmise à la boucle while et ensuite elle sera réinitialiser avec des nouveaux appel à localtime

    Ca ne sers à rien de déclarer à nouveau une variable $secondes avec my (qui sera locale pour le bloc while ) à moins que tu ne veux pas que la variable d'origine change de contenu;
    0
    1. rikki
       
      Merci Lami Je comprends mieux maintenant ..
      0
  9. rikki
     
    Pour info,
    Et si ca peut aider quelqun a un jour

    Voici le script final.
    J'ai du installer la librairie Time::HiRes afin d'avoir un sleep en dessous de la seconde.

    Voici donc le script qui va donc jusqu'a 58secondes en checkant tous les 1 dizieme de seconde

    #!/usr/bin/perl
    use Time::HiRes;
    use strict;use warnings;

    my ($secondes) = localtime(time);
    while( $secondes < 58 )
    {
    Time::HiRes::sleep (0.1);
    ($secondes) = localtime(time);
    print "$secondes\n";
    }
    __END__

    on peut aissi checker tous les 5 centiemes grace a
    Time::HiRes::sleep (0.05);
    a bientot !
    0