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
|