in reply to Why is this exit code -1?

Have a look at the documentation (Update: you'll also find some example code there how to inspect system for errors):

Return value of -1 indicates a failure to start the program or an error of the wait(2) system call (inspect $! for the reason).

And turn on warnings:

$ perl -wMstrict -le 'print system("exit 3");print "<$!>"' Can't exec "exit": No such file or directory at -e line 1. -1 <No such file or directory>

exit is a shell builtin, not an actual system command.

$ which exit $ perl -wMstrict -le 'print system(q{/bin/bash -c "exit 3"}); print "<$!>\n",$?>>8' 768 <> 3

And the AM post explains why the shell doesn't get called in my first example above:

$ perl -wMstrict -le 'system("pstree -A $$ ")==0 or die;' perl---pstree $ perl -wMstrict -le 'system("pstree -A $$;")==0 or die;' perl---sh---pstree

By the way, I can recommend IPC::System::Simple because of its better error handling, and I would also recommend avoiding the shell, if possible - I wrote about the issues with it here, and fellow monk afoken wrote about The problem of "the" default shell.