Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Re: globing files with spaces problem.

by kschwab (Priest)
on Aug 10, 2002 at 15:26 UTC ( #189183=note: print w/replies, xml ) Need Help??

in reply to globing files with spaces problem.

Short Answer: use File::Glob's bsd_glob instead of CORE::glob.

Long Answer:

I get the same problem. At first, it appears to be a bug. Supposing the following directory tree:

/dir1/file1 /dir two/file2
And the following code:

foreach my $dir (glob("*")) { foreach my $file (glob("$dir/*")) { print "[$file]\n"; } }
I get back 'dir' and 'dir1/file1'. Strangely enough, if I use File::Glob's bsd_glob, it works just fine:

use File::Glob qw(bsd_glob); foreach my $dir (bsd_glob("*")) { foreach my $file (bsd_glob("$dir/*")) { print "file [$file]\n"; } }
So, I looked at the docs and found that it's working as documented :)

Since v5.6.0, Perl's CORE::glob() is implemented in terms of bsd_glob(). Note that they don't share the same prototype--CORE::glob() only accepts a single argument. Due to historical reasons, CORE::glob() will also split its argument on whitespace, treating it as multiple patterns, whereas bsd_glob() considers them as one pat tern.

Replies are listed 'Best First'.
Re: Re: globing files with spaces problem.
by Nabuku (Initiate) on Aug 10, 2002 at 17:37 UTC


    When I've used bsd_glob, I got an endless loop. I'm probably doing something wrong...

    Here's the code I've used:

    #!/usr/bin/perl -w use File::Glob qw(bsd_glob); my $source_dir = "/home/haim/tmp/lists"; sub init_source_list { chdir $source_dir or die "Cannot change dir to $source_dir! ($!)"; while (defined($sourcefile = bsd_glob("*"))) { # for every file in +this # directory if (-d $sourcefile) { # if the file is actually a directory... while (defined($ver = bsd_glob("$sourcefile/*"))) { #$ver =~ s/.*\///; #remove everything before the "/". $apps{$sourcefile}{$ver} = undef; # add an empty key to # %apps{$sourcefile} } } else { $apps{$sourcefile} = undef; # add an empty key in the hash # %apps } } } &init_source_list; foreach $key (keys %apps) { if (keys %{ $apps{$key} }) { foreach $vkey (keys %{ $apps{$key} }) { print "$source_dir/$key/$vkey\n"; } } else { print "$source_dir/$key\n"; } }



      while (defined($sourcefile = bsd_glob("*")))


      foreach my $sourcefile (bsd_glob("*"))

      bsd_glob doesn't act like the <*.foo> operator, as CORE::glob does.

        Thanx, this one solved it!!


Re^2: globing files with spaces problem.
by Anonymous Monk on May 08, 2009 at 15:16 UTC
    Hi folks! I tried with inserting '\' before every space, and it worked!

    foreach my $dir (glob("*")) {
    $dir =~ s/ /\\ /g;
    foreach my $file (glob("$dir/*")) {
    print "$file\n";

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://189183]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (8)
As of 2017-09-26 07:38 GMT
Find Nodes?
    Voting Booth?
    During the recent solar eclipse, I:

    Results (292 votes). Check out past polls.