我是Perl的新手,希望有人能告诉我这意味着什么
eval 'exec ${PERLHOME}/bin/perl -S $0 ${1+"$@"}' # -*- perl -*-
if 0;
答案 0 :(得分:4)
perldoc perlrun
中解释了这一点:
-S
使Perl使用PATH环境变量来搜索程序 除非程序的名称包含路径分隔符。
...
通常,这用于在不支持的平台上模拟
#!
启动 支持#!
。调试使用的脚本时也很方便#!
,因此通常由shell的$PATH
搜索找到 机构。此示例适用于许多与shell兼容的平台 Bourne shell:
#!/usr/bin/perl eval 'exec /usr/bin/perl -wS $0 ${1+"$@"}' if $running_under_some_shell;
系统忽略第一行并将程序提供给
/bin/sh
, 继续尝试将Perl程序作为shell脚本执行。 shell执行第二行作为普通的shell命令,因此 启动Perl解释器。在某些系统$0
并不总是如此 包含完整路径名,因此-S
告诉Perl搜索 程序如有必要。在Perl找到程序后,它解析了 行并忽略它们因为变量$running_under_some_shell
永远不会成真。如果程序将是 由csh
解释,您需要将${1+"$@"}
替换为$*
, 即使它不理解嵌入空间(等) 参数列表。要启动sh
而不是csh
,某些系统可能会启动 必须用仅包含冒号的行替换#!
行, 这将被Perl礼貌地忽略。
简而言之,它模仿了具有与Bash兼容的shell的平台的shebang行为。
答案 1 :(得分:1)
它既可以作为shell脚本也可以作为Perl程序使用。由于某种原因,它用于在shebang不工作的系统上运行Perl解释器。它现在很少见,但过去常常在20世纪90年代早期出现。
评论只是一个评论,但它在Emacs中具有特殊含义,它将以perl模式打开文件。
答案 2 :(得分:0)
我只是阅读@Zaid的回复,只要这段代码在正在执行的脚本的第一行,并且没有shebang存在,这比我的更好更正确。我从未见过这种替代品。非常有趣,真的。
第二行if 0;
是第一行的一部分。你可以告诉我,因为第一行缺少;
。如果这是一个很长的单行,评论在分号之后会更加明显。
所以它相当于:
if(0) {
eval 'exec ${PERLHOME}/bin/perl -S $0 ${1+"$@"}
}
在perl中,0将被计算为false,因此eval-clause将永远不会执行。据推测,这种情况(if
)是禁用该线路的快速方法。也许评价曾经是真实的,而不是总是错误的。
有关评估区块本身的信息,请参阅perl --help
,perldoc -f eval
和perldoc -f exec
。
剩下的棘手(${1+"$@"}
)我不知道。反正这不是perl;它由exec
发射的任何一个shell解释(如果我错了,请纠正我!)。如果它是bash,我认为它什么都不做,可以用$ @代替,$ @是包含所有命令行参数的环境变量(即perl中的@ARGV)。