Ok, duh, moved Net::Ping->new() to within the child block so each child instantiates its own $pinger. Now it works. I guess Net::Ping tracks the responses by PID.
Update: Ok, brain fart... You're right, Thelonius, it's using one socket per instantiation instead of creating a new one for each ping. I'll blame my allergy attack.