【问题标题】:perl shebang: `Too late for "-Mstrict" `perl shebang:`“-Mstrict”为时已晚`
【发布时间】:2020-11-17 22:46:54
【问题描述】:

我有以下可敬的 perl 脚本 x.pl:

#!/usr/bin/env -S perl -Mstrict -wp
s/a/b/;

如果我用./x.plperl x.pl 运行它,它会用

Too late for "-Mstrict" option at ./x.pl line 1.

但是……为什么?我认为“为时已晚......”只是-CSDA-T 之类的问题,因为“流已经打开”。此外,shebang 行实际上不是简单地使用指定的开关调用 perl 吗?

【问题讨论】:

  • 我猜这与将use strict; 插入流中有关。只需使用use strict;

标签: linux perl shebang


【解决方案1】:

-M-m 开关不适用于 Perl 脚本中。

#!/usr/bin/perl -Mstrict
# shebang.pl
print 42;

$ perl -Mdiagnostics shebang.pl

- 第 1 行 (#1) 的“-Mstrict”选项为时已晚 (X) #! Perl 脚本中的行(或本地等效项)包含 -M、-m 或 -C 选项。

在 -M 和 -m 的情况下,这是一个错误,因为这些选项 不适合在脚本中使用。请改用 use pragma。

-C 选项仅在命令行中指定为 好(后面有相同的字母或数字序列)。任何一个 在命令行上指定此选项,或者,如果您的系统支持 它,使您的脚本可执行并直接运行它而不是传递 它到 perl。

用户代码中未捕获的异常: - 第 1 行的“-Mstrict”选项为时已晚。

【讨论】:

  • 我认为 OP 意识到 -M 不应该在那里使用,他们想知道为什么。
【解决方案2】:

这是一个故意警告,而不是加载失败。他们想让你远离尝试在 shebang 线上加载模块,即使它(有时)确实有效。这是因为 Perl 无法保证操作系统如何解析和执行脚本的 shebang 行。所以它只是被禁止的。阅读perlrun 了解更多信息。 Perl 实际上会在启动后重新解析 shebang 行,以检查在执行时未正确传递的选项。

$猫脚本.pl #!/usr/bin/perl -w -Mthing 打印“你好世界\n”; $猫东西.pm 打包东西; $|=1; print "东西已加载\n"; sub import { print "导入的东西\n"; } $ ./script.pl 东西被加载了 东西进口被进口了 ./script.pl 第 1 行的“-Mthing”选项为时已晚。 $ perl ./script.pl ./script.pl 第 1 行的“-Mthing”选项为时已晚。 $ perl -x ./script.pl 东西被加载了 东西进口被进口了 你好世界

我同意它现在有点过时,但它是一种将操作系统执行与您的程序分开的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2011-06-21
    • 2015-08-15
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多