Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我会得到;Can';“找不到字符串终止符”'&引用;EOF at之前的任何位置-e第1行“;当我尝试在Windows上运行Perl一行程序时?_Windows_Perl_Cmd - Fatal编程技术网

为什么我会得到;Can';“找不到字符串终止符”'&引用;EOF at之前的任何位置-e第1行“;当我尝试在Windows上运行Perl一行程序时?

为什么我会得到;Can';“找不到字符串终止符”'&引用;EOF at之前的任何位置-e第1行“;当我尝试在Windows上运行Perl一行程序时?,windows,perl,cmd,Windows,Perl,Cmd,我尝试在Windows 5.14.2上运行以下程序 C:\Perl>perl -e 'print "Hello World \n"' Can't find string terminator "'" anywhere before EOF at -e line 1. C:\Perl>Perl-e'打印“Hello World\n”' 在-e第1行的EOF之前的任何位置都找不到字符串终止符“'”。 我错过了什么?你错过了一个有着健全和定义良好的引用规则的体面的外壳。在Windows上,只有双引号被

我尝试在Windows 5.14.2上运行以下程序

C:\Perl>perl -e 'print "Hello World \n"' Can't find string terminator "'" anywhere before EOF at -e line 1. C:\Perl>Perl-e'打印“Hello World\n”' 在-e第1行的EOF之前的任何位置都找不到字符串终止符“'”。
我错过了什么?

你错过了一个有着健全和定义良好的引用规则的体面的外壳。在Windows上,只有双引号被视为引号,转义规则定义不好且不一致。尝试:

perl -e "print qq{Hello World \n}"
我强烈建议不要在Windows上使用最简单的一行程序。(Windows one liners的另一个问题是Windows shell不扩展通配符。如果在命令行中使用
*.txt
,它将查找一个名为
*.txt
的文件。稍后您将遇到该文件。)

在Windows上,您键入的内容相当于:

perl -e "'print" "Hello World \n'"

也就是说,Perl试图执行的代码是
'print
,其中
@ARGV
包含单个字符串
Hello World\n'
。(这不是换行符,这是一个反斜杠,后跟
n
)。

在Windows上,引号应该颠倒。因此,不是:

C:\Perl>perl -e 'print "Hello World \n"'
应该是:

C:\Perl>perl -e "print 'Hello World \n'"

(署名,第6版,第295页)

我也发现这是可行的。我使用的是Windows 7,使用的是
c:\Windows\system32\cmd.exe

perl -e "$a=2; print(\"$a \n \");"

我在print语句中使用了转义斜杠,以使引号在Windows上显示\“

,以下命令有效:


perl-e“print\“Hello world\”

事实上,我认为你夸大了。在Windows中编写一行程序从来没有让我觉得太困难。在Windows中,这是应用程序的工作(而不是shell的工作)解析命令行。在我看来,OPs问题似乎代表了Windows版本Perl中的一个bug?@HarryJohnston,实际上两者都有。首先,shell解析命令行(查找管道、重定向等)。然后,应用程序解析命令行。(通常,解析它的实际上是应用程序的C/C++运行库。)这就是为什么Windows命令行如此混乱的原因;解析规则没有很好的定义,不同的C库解析东西的方式略有不同。@HarryJohnston,在Windows上,Perl根据Windows规则解析命令行。(相反,Perl链接的C库根据Windows规则解析命令行。)一行代码是用Unix shell引用规则编写的,在Windows上不起作用。@HarryJohnston,应用程序不是孤立地解析命令行。shell也在解析命令行。提供了一个很好的示例:
Perl-ne'print if(rand)()<.01)'train.csv
。当shell试图重定向名为
.01)的文件中的输入时,会出现错误“
如果您使用的是perl 5.10+,请使用
-E
选项,而不是
-E
,该选项将启用新功能,其中
say
打印
,但在末尾有一个隐式换行符。
perl-E”说“hello world”“
它在@Eric处不起作用。在这种情况下不起作用。因为这里的问题是引号需要颠倒。(我想知道它是否适用于您…)可能重复打印“Hello World”,\n是按原样打印的,而不是新行。