It can be confusing, sure. Think of it this way: when the parent process start()s a child process, there are, from that moment forward, two processes executing more-or-less parallel with one another. (I say “more-or-less” because the relative timing of the two can’t be exactly predicted ...) Nevertheless, both are executing the same Perl code, at the same point, but with exactly one very important difference:
- In the parent, the process-ID of the new child process is returned as the value of the call to start().
- In the child, the returned value is zero.
- And that’s how the two of them each know which one they are.
The “fork in the road” (heh...) therefore happens with and next. This is shorthand, exploiting Perl’s use of “short-circuit” expression evaluation. The parent immediately continues with the foreach loop (or ends it); the child proceeds. (Here’s the short-circuit: since 0 and anything is known to be false, the right side of the and clause (that is to say, the next statement) is never evaluated in the child.)
Ordinarily, the console-output of both processes will now be intermingled on the screen, in no particular (exactly predictable) order, and yes, you will see that the child does sleep() properly, as any process would do. If you still don’t observe that, please post a snippet of your code (remember to use <code> tags ...) so that we can point out the error of your ways. It is a bit tricky ...