use IPC::Run 'run'; my ($stdout, $stderr); run [ qw/perl -e/, $code ], '<', \$args, '>>', \$stdout, '2>>', \$stderr; #### $ perl my $code = q[use feature 'say'; say for 1..10; warn 'zzz'; $z = ; $z=~y/a-z/A-Z/; say $z]; my $args = q[this is STDIN, why not?]; use IPC::Run 'run'; my ($stdout, $stderr); run [ qw/perl -e/, $code ], '<', \$args, '>>', \$stdout, '2>>', \$stderr; print "STDOUT: $stdout\n"; print "STDERR: $stderr\n"; __END__ STDOUT: 1 2 3 4 5 6 7 8 9 10 THIS IS STDIN, WHY NOT? STDERR: zzz at -e line 1.