in reply to glob with special characters
No shell is involved. If you strace perl (strace -f -ff on linux), you'll see that no shell is spawned.
AFAIK perl now uses File::Glob internally1, and in fact foo.pl as
$a=q|a\ \\\{bc.d/*|;print "pattern <", $a, "> globs to <", (glob $a), +">\n"; print "$_\n" for sort keys %INC;
yields
pattern <a\ \\{bc.d/*> globs to <a {bc.d/GOT ITabcde> Carp.pm Exporter.pm File/Glob.pm Text/ParseWords.pm XSLoader.pm strict.pm vars.pm warnings.pm warnings/register.pm
while running
$a=q|a\{bc.d/*|;print "pattern <", $a, "> globs to <", (glob $a), ">\n +"; print "$_\n" for sort keys %INC;
results in
pattern <a\{bc.d/*> globs to <a{bc.d/GOT ITabcde> File/Glob.pm XSLoader.pm strict.pm
I suspect a subtlety (bug?) in Text::ParseWords or its usage. The behaviour you describe (which I confirm for my systems) looks like a two-pass parsing whenever a whitespace is present - in that case the \{ seems to get "optimized away" (running with -Dcr):
Guessing start of match, REx "\\(.)" against "\{bc.d/*"... Found anchored substr "\" at offset 0... Guessed: match at offset 0 Matching REx "\\(.)" against "\{bc.d/*" Setting an EVAL scope, savestack=56 0 <> <\{bc.d/*> | 1: EXACT <\\> 1 <\> <{bc.d/*> | 3: OPEN1 1 <\> <{bc.d/*> | 5: SANY 2 <\{> <bc.d/*> | 6: CLOSE1 2 <\{> <bc.d/*> | 8: END Match successful! Guessing start of match, REx "\\(.)" against "bc.d/*"... Did not find anchored substr "\"... Match rejected by optimizer Not present... Match failed
No time to track that down rigth now... smells like eval involved.
1) From doio.c:
--shmem
_($_=" "x(1<<5)."?\n".q·/)Oo. G°\ /
/\_¯/(q /
---------------------------- \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: glob with special characters
by Hue-Bond (Priest) on Oct 06, 2006 at 21:38 UTC | |
by shmem (Chancellor) on Oct 06, 2006 at 21:44 UTC | |
by Hue-Bond (Priest) on Oct 07, 2006 at 18:17 UTC |