Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can you force flush output in Perl?

I have the following two lines in Perl:

print "Warning: this will overwrite existing files.  Continue? [y/N]: \n"; my $input = <STDIN>; 

The problem is that the print line does not get executed before the Perl script pauses for input. That is, the Perl script just seems to stop indefinitely for no apparent reason.I'm guessing that the output is buffered somehow (which is why I put the \n in, but that doesn't seem to help).

like image 989
John Avatar asked Nov 19 '15 19:11

John


People also ask

How do you flush an output buffer?

If you want to flush the buffered output at another time, call fflush , which is declared in the header file stdio. h . Preliminary: | MT-Safe | AS-Unsafe corrupt | AC-Unsafe lock corrupt | See POSIX Safety Concepts. This function causes any buffered output on stream to be delivered to the file.

What is $| in Perl?

$| = 1; forces a flush after every write or print, so the output appears as soon as it's generated rather than being buffered. See the perlvar documentation. $| is the name of a special variable.

How do I print a Perl script?

print() operator – print operator in Perl is used to print the values of the expressions in a List passed to it as an argument. Print operator prints whatever is passed to it as an argument whether it be a string, a number, a variable or anything. Double-quotes(“”) is used as a delimiter to this operator.


2 Answers

By default, STDOUT is line-buffered (flushed by LF) when connected to a terminal, and block-buffered (flushed when buffer becomes full) when connected to something other than a terminal. Furthermore, <STDIN> flushes STDOUT when it's connected to a terminal.

This means

  • STDOUT isn't connected to a terminal,
  • you aren't printing to STDOUT, or
  • STDOUT's been messed with.

print prints to the currently selected handle when no handle is provided, so the following will work no matter which of the above is true:

# Execute after the print. # Flush the currently selected handle. # Needs "use IO::Handle;" in older versions of Perl. select()->flush(); 

or

# Execute anytime before the <STDIN>. # Causes the currently selected handle to be flushed immediately and after every print. $| = 1; 
like image 149
ikegami Avatar answered Sep 27 '22 19:09

ikegami


There are several ways you can turn on autoflush:

$|++; 

at the beginning, or also with a BEGIN block:

BEGIN{ $| = 1; } 

However, it seems to be something unusual with your configuration, because usually a \n at the end triggers the flushing (at least of the terminal).

like image 29
Diego Sevilla Avatar answered Sep 27 '22 20:09

Diego Sevilla