http://www.perlmonks.org?node_id=1000919


in reply to Re^2: Using wildcards to open files.
in thread Using wildcards to open files.

As aitap said above, quotemeta will do that, a la my $escaped  = quotemeta($file); or even $cmd = "perl script.pl < \Q$file\E";


#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

Replies are listed 'Best First'.
Re^4: Using wildcards to open files.
by starface245 (Novice) on Oct 25, 2012 at 20:06 UTC
    Both methods doesn't seem to work. It not escaping the space correctly. It doing "A_name\"

      Where's your code? Where's your input? Where's your output? A vague statement that it didn't work correctly is entirely inadequate. Please read How do I post a question effectively?.

      Both methods provided by kennethk work just fine!

      $ mv a.msg 'XYZ @ % a.msg' $ cat 'XYZ @ % a.msg' Message A $ cat script.pl print while (<>) $ perl -e ' use strict; use warnings; my @files = glob("*.msg"); for my $file (@files) { print "Filename: $file\n"; my $cmd = "perl script.pl < \Q$file\E"; system($cmd); } ' Filename: b.msg Message B Filename: c.msg Message C Filename: XYZ @ % a.msg Message A $ perl -e ' use strict; use warnings; my @files = glob("*.msg"); for my $file (@files) { print "Filename: $file\n"; my $escaped = quotemeta $file; my $cmd = "perl script.pl < $escaped"; system($cmd); } ' Filename: b.msg Message B Filename: c.msg Message C Filename: XYZ @ % a.msg Message A

      Also, my original suggestion of using one process instead of thousands still works without modification:

      $ ls -l *.msg -rw-r--r-- 1 ken staff 10 26 Oct 03:01 XYZ @ % a.msg -rw-r--r-- 1 ken staff 10 26 Oct 03:01 b.msg -rw-r--r-- 1 ken staff 10 26 Oct 03:02 c.msg $ perl script.pl *.msg Message A Message B Message C

      -- Ken