#!/usr/bin/perl sub pipeline { pipe my ($read, $write); my $pid = open(my $fh, "-|"); die "Couldn't fork: $!" unless defined $pid; if ($pid) { close $write; chomp(my @pids = map { $_->[1] } sort { $b->[0] <=> $a->[0] } map { [ split /_/ ] } <$read>); close $read; return $fh, @pids; } close $read; exit unless @_; my $cnt; while (my $command = pop) { $cnt++; my $pid = @_ ? open(STDIN, "-|") : -1; die "Couldn't fork: $!" unless defined $pid; next unless $pid; print $write "${cnt}_$$\n"; close $write; exec @$command; die "Couldn't exec @$command"; } } # Silly example, but you get the idea # essentially the same as: # open($fh, "ls -1 | sed -e s/t/a/g |") my ($fh, @pids) = pipeline( [qw(ls -1)], [qw(sed -e s/t/a/g)], ); while (<$fh>) { print "$.:$_"; } close $fh; print "Pids: @pids\n";