运行Perl一行程序时,Windows cmd如何转换命令行?

运行Perl一行程序时,Windows cmd如何转换命令行?,windows,perl,shell,Windows,Perl,Shell,我知道WindowsShell将可执行文件名后的整行代码传递给可执行文件,解析它是可执行文件的任务。 比如说, C:\Users\osiv\Desktop\>perl -e "use File::Spec; print $_.' ' foreach (File::Spec->splitdir(\"C:\\Users\\osiv\\\"));" 应将“perl”之后的所有字符传递给在%PATH%值目录中找到的perl.exe 给我解释一下输出 C:\Users\osiv\Deskto

我知道WindowsShell将可执行文件名后的整行代码传递给可执行文件,解析它是可执行文件的任务。 比如说,

C:\Users\osiv\Desktop\>perl -e "use File::Spec; print $_.' ' foreach (File::Spec->splitdir(\"C:\\Users\\osiv\\\"));"
应将“perl”之后的所有字符传递给在%PATH%值目录中找到的perl.exe

给我解释一下输出

C:\Users\osiv\Desktop\>perl -e "use File::Spec; print $_.' ' foreach (File::Spec->splitdir(\"C:\\Users\\osiv\\\"));"
Can't find string terminator '"' anywhere before EOF at -e line 1.

C:\Users\osiv\Desktop\>perl -e "use File::Spec; print $_.' ' foreach (File::Spec->splitdir(\"C:\\Users\\osiv\\\\"));"
Can't find string terminator '"' anywhere before EOF at -e line 1.

C:\Users\osiv\Desktop\>perl -e "use File::Spec; print $_.' ' foreach (File::Spec->splitdir(\"C:\\Users\\osiv\\\\\"));"
C: Users osiv
我期望Perl通过查找字符串来解析Windows shell传递的字符串,这些字符串应该是“在开始和结束处,我用\”来转义它们”,并期望例如“osiv”);“被解析为
osiv\\\
。但是,
\“osiv\\”);“
没有被解析为
osiv\
,那么它实际上是如何被解析的呢

谁在乎呢?这个只要在Perl一行程序中不使用双引号就可以避免这个问题。你知道你有
q{}
qq{}
可用

cmd的所有转换都是由一个元字符
%
触发的
^
特别有趣:当cmd转换命令行并看到一个
,它会将一个
复制到新的命令行,然后开始将字符从旧命令行复制到新命令行,而不查看这些字符是否为元字符。此复制将继续进行,直到cmd到达命令行的末尾,运行到变量替换,或看到另一个
。在最后一种情况下,cmd将
复制到新命令行并恢复正常处理。这种行为几乎与命令行fromArgVw对同一个角色所做的相同,但并不完全相同;区别在于cmd不知道
\“
序列,并且比我们预期的更早开始解释元字符

此外:

C:\>perl-MFile::Spec::Functions=splitdir-MFile::HomeDir-我们“为splitdir home打印qq{'$\}”

'C:“用户”“思南”

perl-wE“使用File::Spec;打印文件::Spec->splitdir(\“C:\\Users\\osiv”)的“$\”

'C:“用户”“osiv”“”

这表明您应该省略后面的目录分隔符

更好的引用方法 虽然
元字符不能完全保护命令行中的元字符不受意外shell解释的影响,但是
^
元字符可以。当cmd转换命令行并看到
^
时,它会忽略
^
字符本身,并将下一个字符按字面意思复制到新命令行,不管是否为元字符。这就是为什么
^
用作换行符:它告诉cmd将后续换行复制为自身,而不是将该换行视为命令终止符。如果我们在参数字符串中的每个元字符前面加上
^
前缀,cmd将把该字符串转换为我们想要使用的字符串

为了做到这一点,我能想到的最好办法是:

perl-wE^“使用File::Spec;print\^“$\\\^”作为File::Spec-^>splitdir^(\^”C:\\Users\\osiv^)^”

正如我所说的,避免在一行程序中使用
,使用
q{}
、和
qq{}
,谁在乎呢?只要在Perl一行程序中不使用双引号就可以避免问题。你知道你有
q{}
qq{/code>

cmd的所有转换都是由一个元字符
%
^
&
,和
触发的
特别有趣:当cmd转换命令行并看到一个
,它会复制一个
复制到新命令行,然后开始将字符从旧命令行复制到新命令行,而不查看这些字符是否为元字符。此复制将继续进行,直到cmd到达命令行的末尾,运行到变量替换,或看到另一个
。在最后一种情况下,cmd将
复制到新命令行并恢复正常处理。这种行为几乎与命令行fromArgVw对同一个角色所做的相同,但并不完全相同;区别在于cmd不知道
\“
序列,并且比我们预期的更早开始解释元字符

此外:

C:\>perl-MFile::Spec::Functions=splitdir-MFile::HomeDir-我们“为splitdir home打印qq{'$\}”

'C:“用户”“思南”

perl-wE“使用File::Spec;打印文件::Spec->splitdir(\“C:\\Users\\osiv”)的“$\”

'C:“用户”“osiv”“”

这表明您应该省略后面的目录分隔符

更好的引用方法 虽然
元字符不能完全保护命令行中的元字符不受意外shell解释的影响,但是
^
元字符可以。当cmd转换命令行并看到
^
时,它会忽略
^
字符本身,并将下一个字符按字面意思复制到新命令行,不管是否为元字符。这就是为什么
^
用作换行符:它告诉cmd将后续换行复制为自身,而不是将该换行视为命令终止符。如果我们在参数字符串中的每个元字符前面加上
^
前缀,cmd将把该字符串转换为我们想要使用的字符串

为了做到这一点,我能想到的最好办法是:

perl-wE^“使用File::Spec;print\^“$\\\^”作为File::Spec-^>splitdir^(\^”C:\\Users\\osiv^)^”

正如我所说的,避免将
放在一行程序中,使用
q{}
qq>