有人能告诉我这在Perl中意味着什么

时间:2011-08-25 10:34:42

标签: perl

我是Perl的新手,希望有人能告诉我这意味着什么

eval 'exec ${PERLHOME}/bin/perl -S $0 ${1+"$@"}' # -*- perl -*-
if 0;

3 个答案:

答案 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 --helpperldoc -f evalperldoc -f exec

剩下的棘手(${1+"$@"})我不知道。反正这不是perl;它由exec发射的任何一个shell解释(如果我错了,请纠正我!)。如果它是bash,我认为它什么都不做,可以用$ @代替,$ @是包含所有命令行参数的环境变量(即perl中的@ARGV)。