defined(my $kid = open RESULT, "-|") or die "fork: $!"; unless ($kid) { # kid does: defined(my $grandkid = open PUMP, "-|") or die "child fork: $!"; unless ($grandkid) { # grandkid does: print @LotsOfDataHere; exit 0; } open STDIN, "<&PUMP" or die "Cannot dup PUMP to STDIN: $!"; exec "anotherprogram"; die "exec anotherprogram: $!"; } while () { # process the large result ... }