in reply to $|++ Does What, Exactly? (was: $++ Does What, Exactly?)

On some platforms select for timeouts won't work, so you have to use sleep instead.
$|++; for (split //, "Just a proud\b\b\b\b\b\bnother Perl hacker,\n") { print; select (undef, undef, undef, 0.3); }
Without $|++ this would most emphatically not have the same effect. :-)

More practically, I have seen CGIs that use system calls fail if the CGI script was buffered, and the thing called did not use buffering. But most of the time you want buffering since it is easier on the system and makes IO faster.

UPDATE
Apparently by default Windows turns buffering off on interactive scripts. You may need to pipe the output of the above through the following script to see the effect of $|:

$| = 1; while (read(STDIN, $buf, 1)) { print $buf; }
UPDATE 2
I have been informed that this doesn't work. I know I have gotten the principle working on NT before, but without Windows to test on, I can't really debug this one. Sorry.

Replies are listed 'Best First'.
Re: Re: $++ Does What, Exactly?
by extremely (Priest) on Feb 11, 2001 at 00:17 UTC
    Actually, I think perl in general has begun sniffing the STDOUT to see if it is a terminal and turning buffering off if it is. My example printed to the screen with STDOUT and STRERR rather than a file was dissappointingly doing the right thing. =)

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

      On Linux at least the default buffering for things heading to the screen is buffered on the return. Which is why my interactive example involved sending one character at a time. :-)

      UPDATE
      It also flushes upon reading from STDIN. These two features make interactive scripts much more reasonable.