>perl -MShellQuote::Any::Tiny=shell_quote -E "system $^X, '-E', 'say f
+or @ARGV', 1, shell_quote(qq(\x5c\x5c \x5c)), 2"
1
\\\ \
2
According to comment in source, [we now] "escape backslash that is followed by a backslash, or the last backslash". That's not what rules 4-7 in MS guidelines say, if we 'reverse' them. 'Reverse', because they say how to parse a command line, and, of course, Perl does it OK for all test cases provided on that page:
perl -E "system $^X, '-E', 'say for @ARGV', qq(\x22abc\x22 d e)"
perl -E "system $^X, '-E', 'say for @ARGV', qq(a\x5c\x5c\x5cb d\x22e f
+\x22g h)"
perl -E "system $^X, '-E', 'say for @ARGV', qq(a\x5c\x5c\x5c\x22b c d)
+"
perl -E "system $^X, '-E', 'say for @ARGV', qq(a\x5c\x5c\x5c\x5c\x22b
+c\x22 d e)"
While we need the opposite: to escape arguments, so that when Perl #1 simply glues them together, another program (e.g. Perl #2) breaks the CL to the same arguments. Line 24
$arg =~ s/(\\(?!.*\\)|\\(?=\\)|")/\\$1/g;
could be replaced with
$arg =~ s/\\(?=\\*(?:"|$))/\\\\/g;
$arg =~ s/"/\\"/g;
Then round-trip tests pass OK (though they are trivial, of course):
perl -MShellQuote::Any::Tiny=shell_quote -E "system $^X, '-E', 'say fo
+r @ARGV', map {shell_quote $_} qw(abc d e)"
perl -MShellQuote::Any::Tiny=shell_quote -E "system $^X, '-E', 'say fo
+r @ARGV', map {shell_quote $_} qq(a\x5c\x5c\x5cb), 'de fg', 'h'"
perl -MShellQuote::Any::Tiny=shell_quote -E "system $^X, '-E', 'say fo
+r @ARGV', map {shell_quote $_} qq(a\x5c\x22b), 'c', 'd'"
perl -MShellQuote::Any::Tiny=shell_quote -E "system $^X, '-E', 'say fo
+r @ARGV', map {shell_quote $_} qq(a\x5c\x5cb c), 'd', 'e'"
Edit. P.S. Issue fixed (on the same day) in 0.007 version. I'm out of issues.
:-)
|