当我使用Perl执行我的Python脚本时,为什么没有语法错误?

87

我刚刚将一些测试Python代码写入test.py,现在我按照以下方式启动它:

perl test.py

过了一会儿,我才意识到我的错误。我说“过了一会儿”,因为Python代码实际上得到了正确执行,就像在Python解释器中一样!

为什么我的Perl在解释我的Python?test.py的代码是这样的:

#!/usr/bin/python

...Python code here...

有趣的是,如果我相反地操作(即调用python something.pl),我会得到大量的语法错误。


6
我猜这是因为文件开头有 #! 符号。如果我删除这个 she-bang,我会得到期望的行为。无论如何,从安全角度来看,这不是一个好主意吗? - Dacav
8
不行。shebang路径的作用是指定解释器。如果你不信任代码能够运行,那么首先就不应该运行它。 - Sobrique
1
不,其实不是。你的脚本只是一个文本文件,仅此而已。没有解释器它是无法“运行”的。 - Sobrique
4
“为什么我的Perl解释器会解释Python代码?”这个问题并不是“一个无法再现或简单的排版错误问题”。已投票重新开放。问题和答案的点赞数显示这是一个受欢迎的问题。 - ikegami
2
@ikegami 不管它是否受欢迎,这显然不是“一个简单的排版错误……以一种不太可能帮助未来读者的方式解决”。 投票重新开放。 - ThisSuitIsBlackNot
显示剩余4条评论
1个回答

114

来自perlrun

如果 #! 行中不含有单词 "perl" 或者 "indir",那么就会执行 #! 后面指定的程序而不是 Perl 解释器。这听起来有点奇怪,但它可以帮助那些机器上不支持 #! 的人们,在这种情况下,他们可以告诉程序他们的 SHELL 是 /usr/bin/perl,然后 Perl 就会把程序分配给恰当的解释器。

例如:

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

33
哇,真是一个晦涩的功能。我已经使用Perl超过20年了,但我不知道它可以这样做。 - cjm
4
我开始在DOS、VMS和Solaris上使用Perl v4。正是由于它的跨操作系统桥接特性,使得跨平台的开发变得更加容易。 - tjd
1
@MarcvanLeeuwen 当你为Linux、OSX、VAX/VMS、Windows、Solaris、OS/2等系统编写程序时,最烦人的部分是启动脚本语言程序,因为这些系统虽然通常共享“输入命令,找到并执行”的功能,但几乎所有其他操作都不同。Perl的这个特性使得Perl在功能上成为一个易于填补差距的桥梁——你只需要编写一个类Unix风格的shebang,如果Perl存在,无论是Perl代码还是其他代码,都将始终工作——就像一个更通用的#! /usr/bin/env foo - zxq9
2
这只是巩固了Perl作为编程语言中“万能解决方案”的声誉。有趣的是,我认为shebang的最初实现是作为shell功能,它后来才移植到Unix内核中。Perl包括许多shell机制(例如,用于替换命令输出的反引号),这只是其中之一。 - Barmar
2
ruby 做同样的事情 >.< - Vadim Pushtaev
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接