How to connect processes via pipe in Perl?
Clash Royale CLAN TAG#URR8PPP
How to connect processes via pipe in Perl?
I want to write a Perl script which runs the programs foo
and bar
and processes stdout
of foo
and emits it to stdin
of bar
in a streaming fashion. The Perl script should act like this bash
command:
foo
bar
stdout
foo
stdin
bar
bash
$ foo | some-perl-code | bar
I managed to do the first part with the snippet below. I start the program foo
and open the pipe to read stdout
.
foo
stdout
open( my $pipe_fh, "foo |" );
while ( my $row = <$pipe_fh> )
# do stuff
print $row;
How can I realize the second part? How can I emit $row
to the program bar
within my Perl script?
$row
bar
3 Answers
3
Just use another open, but revert the direction of the pipe:
open my $in, '-|', 'foo' or die $!;
open my $out, '|-', 'bar' or die $!;
while ( my $row = <$in> )
# do stuff
print $out $row;
Another option is using IPC::Pipeline to chain the processes together instead of doing it manually.
IPC::Run is also another (somewhat daunting) option. If you end up with complex pipelines, may I also recommend (shameless promotion of own module) IPC::PrettyPipe, which I wrote to help render complex pipelines.
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
Why does this have to be in a Perl scrip? Why can't you use bash directly?
– JGNI
Jul 31 at 10:33