我是Perl的新手,正在处理其他人编写的Perl文件,我在脚本的开头遇到了以下语句:
eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' && eval 'exec perl -w -S $0 $argv:q' if 0;
这两条线做了什么?什么是代码检查?什么是if 0;一句呢?
解决方法
这是exec hack的变种.在使用#!可靠地指定解释器的前几天,这用于制作shell exec perl.第二行的if 0永远不会被shell读取,它只读取第一行并执行perc,它读取if 0并且不会重新执行自身.
这是一个有趣的变体,但我认为不太正确.它似乎设置为使用bourne shell或csh变体,使用初始eval确定解析它的shell,然后使用适当的语法将参数传递给perl.中间子句是sh语法,最后一个子句适用于csh.如果第二个&&是||并且最初的eval'(退出$?0)确实在csh中失败了,那么这将实现这些目标,但正如所写,我认为它不适用于csh.是否有一个命令在此之前设置$?基于shell的某些价值?但即使是这样的情况和$?设置为非零值,除非&&和&替换为||.有趣的事情正在发生.