web-dev-qa-db-fra.com

pouvez-vous forcer la sortie affleurante en perl

J'ai les deux lignes suivantes en Perl:

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

Le problème est que la ligne d'impression n'est pas exécutée avant que le script Perl s'interrompt pour la saisie. En d’autres termes, le script Perl semble s’arrêter indéfiniment sans raison apparente. Je devine que la sortie est en quelque sorte tamponnée (c'est pourquoi je mets le\n dans, mais cela ne semble pas aider). Je suis assez nouveau chez Perl, alors j’apprécierais tout conseil sur la façon de résoudre ce problème.

12
John

Par défaut, STDOUT est mis en tampon de ligne (vidé par LF) lorsqu'il est connecté à un terminal, et mis en tampon de bloc (vidé lorsque le tampon est plein) lorsqu'il est connecté à autre chose qu'un terminal. De plus, <STDIN> efface STDOUT lorsqu'il est connecté à un terminal.

Ça signifie

  • STDOUT n'est pas connecté à un terminal,
  • vous n'imprimez pas sur STDOUT, ou
  • STDOUT a été gâché.

print imprime dans le handle selected actuel lorsqu'aucun handle n'est fourni. Par conséquent, ce qui suit fonctionnera, peu importe lequel des cas ci-dessus est vrai:

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

ou

# Execute anytime before the <STDIN>.
# Causes the currently selected handle to be flushed after every print.
$| = 1;
24
ikegami

Vous pouvez activer l'autoflush de plusieurs manières:

$|++;

au début, ou aussi avec un bloc BEGIN:

BEGIN{ $| = 1; }

Cependant, cela semble inhabituel dans votre configuration, car un \n à la fin déclenche le vidage (du moins du terminal).

8
Diego Sevilla
use IO::Handle;
STDOUT->flush();
0
Gábor