6

我正在寻找权威确认或更正我认为我知道的关于-CSDAPerl 脚本的 shebang 行上的选项的人。

请参阅perldoc perlrun以获取-CSDA. 简要地

  • S: STDIN,STDOUTSTDERR假定为 UTF-8
  • D:UTF-8 是输入和输出流的默认 PerlIO 层
  • 答:@ARGV 元素应为以 UTF-8 编码的字符串
  • 为了-CSDA产生任何效果,它必须在命令行中指定,如perl -CSDA script.pl.

  • 在 5.10 之前,-CSDAshebang 行会静默失败,因为标准流@ARGV在遇到它时已经打开并且已经填充,除非-CSDA已经在命令行上指定。

  • 在 5.10 之后,-CSDA它只出现在 shebang 线上会perl因为这个问题而导致呱呱叫。

  • -CSDA用于s pre-5.10的脚本perl应该-CSDA从 shebang 行中删除,因为它从未在命令行上使用这些选项调用(并且选项,如果仅在 shebang 行上指定,则什么都不做)。

我很想得到一些可靠的反馈,说明我上面的哪些假设是错误的。

4

2 回答 2

3

如果您的脚本是

#!/usr/bin/perl -CSDA

你开始你的脚本使用

./script foo

操作系统将按如下方式启动 Perl:

/usr/bin/perl -CSDA ./script foo

只有在错误启动脚本(例如使用

/usr/bin/perl ./script foo

修复不是删除-CSDA,修复是正确调用脚本。

于 2011-03-18T18:26:57.387 回答
3

不知道我有多权威,但我知道这是如何运作的。

  • 你的第一个假设几乎是准确的。要使 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得到尊重。
于 2011-03-18T16:23:55.787 回答