2010-11-06 30 views
2

Je pense qu'il devrait y avoir un moyen simple de faire cela, mais la recherche autour ne me donne pas de bonnes pistes. Je veux juste open() un tuyau à une application, écrire des données à lui, et avoir la sortie du sous-processus envoyé au STDOUT du script appelant.Rediriger STDOUT d'un tuyau en Perl

open(my $foo, '|-', '/path/to/foo'); 
print $foo 'input'; # Should behave equivalently to "print 'output'" 
close($foo); 

est-il un moyen simple de le faire, ou ai-je frappé sur l'un des nombreux « ne peut pas y arriver d'ici » moments en Perl?

+0

Votre sortie de processus à l'écran? – PizzAzzra

Répondre

4

Le sous-processus héritera automatiquement de STDOUT. Cela fonctionne pour moi:

open(my $f, "|-", "cat"); 
print $f "hi\n"; 

Si vous n'êtes pas vraiment la fermeture du tuyau immédiatement le problème pourrait être à l'autre bout: SDOUT en mémoire tampon ligne par défaut, de sorte que vous voyez print "hello world\n" immédiatement. Le tuyau à votre sous-processus sera bloc tamponné par défaut, de sorte que vous pouvez réellement attendre les données de votre script Perl pour atteindre l'autre programme:

open(my $f, "|-", "cat"); 
print $f "hi\n"; 
sleep(10); 
close($f); # or exit 
# now output appears 

Essayez d'ajouter select $f; $| = 1 (ou je pense que la façon plus moderne est $f->autoflush(1))

+0

Huh. Doit être un problème avec l'application particulière, alors. –

+0

Ajout d'une autre idée - je ne sais pas si les modifications apparaissent en tant que notifications pour vous. –

+0

Il ne sert à rien de dormir après l'impression d'un tuyau: même perlio utilise un tampon de style stdio. 'select ((select ($ f), $ | = 1) [0])' répare cela. Hm, y a-t-il une raison pour qu'une telle pipe exotique soit ouverte mais sans vérification d'erreur? Pourquoi ne pas simplement: 'open (my $ f," | cat ") || die "ne peut pas ouvrir le tuyau à chat: $!"; '? – tchrist