opendir my $dh, '/path/to/files', or die ...; while( my file = readdir $dh ) { next unless $file =~ m[\.xml$]; # do something with the file } closedir $dh; #### #! perl -slw use strict; require 5.008; use threads qw[yield]; use threads::shared; use Thread::Queue; use vars qw[$N]; die "Usage: $0 [-N=nn] dir .*\.xml" unless @ARGV == 2; $N ||= 100; my $signal : shared = 0; my $Q = Thread::Queue->new(); sub readdir_asynch { my ($dir, $mask) = @_; print $mask; opendir my $dh, $dir or die "Couldn't open $dir"; while( not $signal ) { yield if $Q->pending > $N; my $file = readdir( $dh ); last unless defined $file; $Q->enqueue( $dir . '/' . $file ) if $file =~ m[^$mask$]; } $Q->enqueue( "QUITING!!" ); } my $thread = threads->create( \&readdir_asynch, $ARGV[0], $ARGV[1] ); yield; while( ( my $file = $Q->dequeue ) ne 'QUITING!!' ) { printf "%s [%d]\n", $file, -S $file; } $thread->join;