Tenir compte le script perl suivant (read.pl
):Perl: éviter la lecture gourmande de stdin?
my $line = <STDIN>;
print "Perl read: $line";
print "And here's what cat gets: ", `cat -`;
Si ce script est exécuté à partir de la ligne de commande, il obtiendra la première ligne d'entrée, tandis que cat
obtient tout le reste jusqu'à la fin de l'entrée (^D
est pressé).
Cependant, les choses sont différentes lorsque l'entrée est canalisé d'un autre processus ou de lecture d'un fichier:
$ echo "foo\nbar" | ./read.pl
Perl read: foo
And here's what cat gets:
Perl semble tampon greadily quelque part l'entrée entière, et les processus appelés en utilisant les backticks ou système ne pas voir aucune de l'entrée.
Le problème est que je voudrais tester un module qui mélange <STDIN>
et les appels à d'autres processus. Quelle serait la meilleure façon de faire cela? Puis-je désactiver la mise en mémoire tampon d'entrée dans Perl? Ou est-ce que je peux spouler les données d'une manière qui "imitera" un terminal?
Ceci est vraiment utile, merci. Y a-t-il un moyen de dire au shell (ou IPC :: Run, ou popen, ou autre chose) quel mode de buffering il devrait utiliser? –
@Jonas Wagner J'ai joué avec ça pendant un moment. Je n'ai pas trouvé de solution. La réponse courte est "ne fais pas ça". Demandez 'perl' de lire le contenu de' STDIN' et de le transmettre au programme. –
On dirait qu'il y a Expect.pm pour perl, qui utilise un pseudo-tty pour communiquer avec un processus (voir ma réponse ci-dessous). –