Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Newbie here- but nevertheless, I've got to get something done.

I'm trying to get the sleep function working for a scan script that I'm writing to check a directory for new files every n seconds. My simple test case is this:

#!/usr/bin/perl -w use strict; { print "I'm going to sleep"; sleep(1); redo; }

When executed it never wakes up!Can anyone help me out and explain what I'm doing wrong with this?

Replies are listed 'Best First'.
Re: sleep?
by merlyn (Sage) on Mar 20, 2001 at 21:20 UTC
    You didn't unbuffer STDOUT, so you are probably looping all the time and won't see it until you accumulate 8K of output. Add $|++; at the start of your script. Or use warn instead of print.

    -- Randal L. Schwartz, Perl hacker

(Zigster)Re: sleep?
by zigster (Hermit) on Mar 20, 2001 at 21:24 UTC
    It works just fine you just cand see it working cause of the buffering at work here. Add a new line char to the print eg:
    #!/usr/bin/perl -w use strict; { print "I'm going to sleep\n"; sleep(1); redo; }
    You may also want to take a look at $|++ which will turn buffering off and will also allow your code to work.

    HTH.


    --

    Zigster

      It was surprising to me, also, that one must add a "\n" to one's programs to see the output as it is printed. Typing 'perldoc perlfaq5' from the command line explains why.

      It turns out that the need to add a "\n" is an artifact of Larry Wall choosing to write perl in C. Perldoc explains that

      The C standard I/O library (stdio) normally buffers characters set to devices...Any time you use print() or write() in Perl, you go through this buffering...Serial devices (e.g., modems, terminals) are normally line buffered, and stdio sends the entire line when it gets the newline.

      The more I learn about Perl, the more I think that to really know Perl one must know the language that Perl is written in, C. Moreover, I think that, even aside from portability problems, Perl would not have been Perl if Larry had chosen to write it in Lisp or Pascal. Much of what we think of as Perlish is really C-ish.

        You've thumped a big nail on the head there my friend! People new to the language never quite understand that perl started out a melange of C, awk, sed, and shell-script. Not knowing at least a little about them can slow down your understanding of many a perl quirk. Maybe we should hang a real post of this up under Meditations...

        --
        $you = new YOU;
        honk() if $you->love(perl)

Re: sleep?
by myocom (Deacon) on Mar 20, 2001 at 21:36 UTC

    You can either add a $|++ to unbuffer STDOUT, or you can use the somewhat more Perlish (IMHO)

    while (sleep(1)) { print "I'm going back to sleep.\n"; }

    Note that this does change the logic slightly, in that the script will sleep for one second before the first print.

      Then why not say -
      do { print "I'm going to sleep\n"; } while (sleep(1))

      :)

      Guildenstern
      Negaterd character class uber alles!
        Yes, but note that do{}while(); is not actually a loop. You can't use loop control mechanics like last and next. This is noted under Universal Blunders, page 529 in Camel 2:
        • Using loop control statements in do {} while. Although the braces in this control structure look suspiciously like part of a loop BLOCK, they aren't.
        This is also mentioned here.