note
fullermd
<blockquote>
When we say "$manager->start and next;" , doesn't what is below this statement (rest of the for loop that is) get skipped completely?
</blockquote>
<p>
The [doc://perlop#Logical-And|and] isn't just a "do this then this", it's a shortcut operator. If the <c>$manager->start</c> evaluates to something true, it does the <c>next</c>, but otherwise it doesn't.
</p>
<p>
In the particular case of [mod://Parallel::ForkManager], the <c>->start</c> method returns values just like [doc://fork] does; in the parent, it returns the pid of the child (which is a positive integer, and thus true), and in the child, it returns 0 (which is false).
</p>
<p>
So, the result is that in the parent process, the <c>next</c> happens, and it goes around and spawns off the next one (which is what you want the parent to do). In the child, since the <c>->start</c> returns a false value, the <c>and</c> isn't followed, and it goes ahead and does the bits of actual work. The child does its thing (with [doc://system] in this case), and then calls the <c>->finish</c> method, which is equivalent to [doc://exit], so the child doesn't go back to the top of the loop and try spawning off more children (that's the parent's job).
</p>
291446
786852