我正在寻找可以权威地确认或纠正我认为对Perl脚本的shebang行上的-CSDA
选项了解的信息的人。
有关-CSDA
的文档,请参见perldoc perlrun。简要地
为了使-CSDA
生效,必须像在perl -CSDA script.pl
中一样在命令行上指定它。 在5.10之前,shebang行上的-CSDA
会静默失败,因为除非在命令行上也已指定@ARGV
,否则在遇到标准流之前,已经打开了标准流,并且已经填充了-CSDA
。 在5.10之后,仅出现在shebang行上的-CSDA
会导致perl
崩溃,原因是该问题。 具有-CSDA
的脚本(以前用于perl
5.10之前的版本)应该从shebang行中删除-CSDA
,因为它从未在命令行上与这些选项一起被调用(如果仅在shebang行上指定了这些选项,则会执行该操作)没有什么)。
对于上述我的哪些假设是错误的,我希望得到一些可靠的反馈。 不确定我的权威程度如何,但是我知道这是如何工作的。
您的第一个假设几乎是正确的。为了使SDA选项生效,必须在启动解释器时将其存在。这可能是由于命令行上的-CSDA所致,也可能是由于PERL_UNICODE环境变量所致,或者可能是我不知道的其他方法所致。 您的第二个假设是正确的,至少对于5.8.8。请注意,对于脚本打开的流,D标志仍将具有其正常的作用。 您的第三个假设是正确的。但是,从5.10.1开始,如果通过PERL_UNICODE环境变量或其他某种机制启用了适当的标志,它将不会崩溃。 您的第四个假设通常是不正确的。我想您指的是直接调用脚本而不是使用脚本作为参数调用perl解释器的情况。一般有两种情况。
在操作系统确定扩展名为“.pl”的任何文件将被传递到perl解释器以执行的系统上(例如Windows),您可能是正确的。但是可以争论的是,在不使用-CSDA的情况下调用脚本时,它们会发出嘶哑的声音,而不是神秘地失败,因为标准输入和@ARGV并非脚本期望的UTF-8。 在直接执行脚本时会读取shebang行的系统上(如大多数* nix shell),在调用解释器时将使用shebang行中指定的命令行选项,因此将遵守shebang行上的-CSDA 。