To have both STDIN & STDOUT of a subprocess redirected, you should
read the "Bidirectional Communication with Another Process" section of the
perlipc man page: http://search.cpan.org/~rjbs/perl-5.18.1/pod/perlipc.pod#Bidirectional_Communication_with_Another_Process
Using the same version of perl works by finding out the name of your
perl interpreter, and calling it explicitly. $^X is probably what you want.
It may or may not work on different operating systems.
Passing a hash into a subprocess does not work easily. You can print the
contents of the hash into a file, and have the subprocess read & parse
it. You might get away without using a file, by using the STDIN channel
between the two processes, or you could open a separate pipe() for this
purpose. Anyway, printing & parsing the data back cannot be avoided
when using subprocesses, because the two processes use two perl
interpreters, each having its own memory space, and not being able to see
each other's variables.
You might avoid using a subprocess, by using fork() + eval() +
require(). In that case, no separate perl interpreter will be involved, the
forked interpreter will inherit the whole memory of your program with all
variables, open file descriptors, sockets, etc. in it, including the hash
to be passed. However, I don't see from where your second perl script could
get its hash when started from CLI.