in reply to fork : distinguish between different child?

First, you should be using use strict; use warnings;.

You do it the same way as you would if you didn't fork.

for my $idx (1..4) { ... fork ... say $dirnames[$idx - 1]; ... }

Of course, 4 is wrong since you only have three directories.

for my $idx (1..@dirnames) { ... fork ... say $dirnames[$idx - 1]; ... }

But why start at 1?

for my $idx (0..$#dirnames) { ... fork ... say $dirnames[$idx]; ... }

But why numbers at all?

for my $dirname (@dirnames) { ... fork ... say $dirname; ... }

Of course, your flow doesn't make much sense right now if you're trying to make stuff parallel.

  1. Launch first child.
  2. Wait for first child to finish.
  3. Launch second child.
  4. Wait for second child to finish.
  5. Launch third child.
  6. Wait for third child to finish.
  7. Launch fourth child.
  8. Wait for fourth child to finish.

You want:

  1. Launch first child.
  2. Launch second child.
  3. Launch third child.
  4. Launch fourth child.
  5. While children exist,
    1. Wait for a child to finish.

See also: Parallel::ForkManager