my @INPUT = (... many lines of text ...); my @COMMAND = qw(tr a-zA-Z A-Za-z); # swap lower/upper case my @RESULT; # this is where the result will go... if (open RESULT, "-|") { # original process @RESULT = ; } else { # child if (open STDIN, "-|") { # child exec @COMMAND; die "Cannot exec: $!"; } else { # grandchild print @INPUT; exit 0; } }