Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

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

    Hi

    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"; } }

    Thanx
    --
    Nabuku

      Change:

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

      to:

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

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

        Thanx, this one solved it!!

        --
        Nabuku

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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://189183]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (5)
As of 2016-10-01 23:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How many different varieties (color, size, etc) of socks do you have in your sock drawer?






    Results (9 votes). Check out past polls.