Well, the first thing anyone will tell you is
in reply to How to "transfer control" to child process?
and see if Perl itself starts telling about anything odd or finding any mistakes.
I see that you invoke the program with a line containing << !. That changes STDIN to read from something else (I'm not familiar enough with ksh to know if ! has a special meaning or is the name of a file). That stays in effect through all the programs called down through system, so the use of STDIN won't prompt the user but will keep reading from ! (whatever that is).
What is the purpose of that? I don't see your main script reading anything from STDIN itself.