我正在寻找可以权威地确认或纠正我认为对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 。
  • 10-07 23:48