If system sees shell metacharacters in the string it is given, in invokes a shell to do the work. (Otherwise it exec's the command directly.) You can therefore do stuff like: perl -e 'system("sleep 20&");print "Hi\n";' and you will see "Hi" right away. There are lots of other possibilities for asynchronous job control with Perl. There are man pages for perlfork and perlipc that are helpful. The latter contains a discussion of the "forking form of open()" that is another way to get asynchronous command execution.
in reply to Does syscall wait for the command to finish?