Try man perlvar:
$$ The process number of the Perl running this script.
(Mnemonic: same as shells.)
$? The status returned by the last pipe close, backtick
(``) command, or system() operator. Note that this
is the status word returned by the wait() system
call (or else is made up to look like it). Thus,
the exit value of the subprocess is actually ($? >>
8), and $? & 255 gives which signal, if any, the
process died from, and whether there was a core
dump. (Mnemonic: similar to sh and ksh.)
Note that if you have installed a signal handler for
SIGCHLD, the value of $? will usually be wrong
outside that handler.
Inside an END subroutine $? contains the value that
is going to be given to exit(). You can modify $?
in an END subroutine to change the exit status of
the script.
Under VMS, the pragma use vmsish 'status' makes $?
reflect the actual VMS exit status, instead of the
default emulation of POSIX status.