#! perl -slw use strict; use threads; use Thread::Queue; sub worker { my $Q = shift; my $count = 0; while( my $path = $Q->dequeue ) { chomp $path; my $file = do{ local( @ARGV, $/ ) = $path; <> }; $count += () = $file =~ m[my]g; } return $count; } our $THREADS //= 4; my $Q = new Thread::Queue; my @workers = map{ threads->create( \&worker, $Q ); } 1 .. $THREADS; open DIR, '-|', q[ dir /s /b *.pl ] or die $!; $Q->enqueue(