use strict; use warnings; use Benchmark; use Cwd; my $path = '\\\\big\unc\path\name'; my $wild = 'ABC*'; chdir($path); my $cwd = cwd; print $cwd, $/; my $results = timethese( 10, { 'plglob' => sub { my @files = plglob($wild); die if not @files }, 'rdglob' => sub { my @files = rdglob($wild); die if not @files }, 'qxglob' => sub { my @files = qxglob($wild); die if not @files }, 'fdglob' => sub { my @files = fdglob($wild); die if not @files } } ); Benchmark::cmpthese( $results ); sub plglob { my $wild = shift; return glob($wild); } sub rdglob { my $wild = shift; opendir(DIR, '.') or return (); my @files; $wild = wildcard($wild); while (defined($_ = readdir(DIR))) { push(@files, $_) if m{$wild}; } closedir(DIR); return @files; } sub qxglob { my $wild = shift; my @files = `dir /b`; chomp @files; $wild = wildcard($wild); @files = grep { m{$wild} } @files; return @files; } sub fdglob { my $wild = shift; use File::DosGlob; my @files = DosGlob($wild); return @files; } # turn a file mask like "ABC*.txt" into a regex like qr{ABC[^/\\]*\.txt} # (yes, this is a really fragile bug-prone way to go!) sub wildcard { my $wild = shift || '*'; $wild =~ s!\?![^\/\\]!g; $wild =~ s!\*![^\/\\]*!g; $wild =~ s!\\!\\\\!g; $wild =~ s!\.!\\.!g; $wild = qr{\A$wild\z}; return $wild; }