Here's a patch that simplifies passing arbitrary glob patterns to C< File::DosGlob::glob() > by making it accept an array reference containing the glob patterns. Rationale - if you want to DosGlob a path containing both spaces and backslashes eg. C:\Program Files\* You need to 'escape' it such that it passes thro' C<Text::ParseWords::parse_line()> in one piece. I currently use this to cover globbing arbitrary paths: sub dosglob { require File::DosGlob; my $pat = $_[0]; # just handle one pattern if ($pat =~ /[ ']/) { # escape it such that Text::ParseWords::parse_line() # sees unquoted text $pat =~ s|\\|\\\\|g; $pat =~ s|([ '])|\\$1|g; } return File::DosGlob::glob($pat); }; ..but it seems like overkill. My proposed change would allow you to simply say: File::DosGlob::glob \@glob_patterns File::DosGlob::glob ["C:\\Program Files\\*"] Cheers, alex. # %< --- DosGlob.pm-orig 2008-07-27 17:01:27.140625000 +0100 +++ DosGlob.pm-new 2008-07-27 17:13:36.593750000 +0100 @@ -9,7 +9,7 @@ package File::DosGlob; -our $VERSION = '1.01'; +our $VERSION = '1.02'; use strict; use warnings; @@ -313,7 +313,10 @@ $pat = $_ unless defined $pat; # extract patterns - if ($pat =~ /\s/) { + if (ref($pat) eq 'ARRAY') { + @pat = @$pat; + } + elsif ($pat =~ /\s/) { require Text::ParseWords; @pat = Text::ParseWords::parse_line('\s+',0,$pat); } @@ -434,6 +437,9 @@ @perlfiles = glob "..\\pe?l/*.p?"; print <..\\pe?l/*.p?>; + # to glob arbitrary pathnames, pass an array ref: + @matches = glob ["C:\\Program Files\\*\\*"]; + # from the command line (overrides only in main::) > perl -MFile::DosGlob=glob -e "print <../pe*/*p?>" @@ -460,6 +466,10 @@ C<Text::ParseWords::parse_line()>, so see L<Text::ParseWords> for details of the quoting rules used. +From version 1.02 onwards, C<File::DosGlob::glob()> also accepts an array +reference containing the glob patterns. This allows you to pass arbitrary +patterns which might contain both spaces and backslashes. + Extending it to csh patterns is left as an exercise to the reader. =head1 NOTES