Perl解释器指令:`Too late for "-Mstrict"`

3

我有一个尊重的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; - ikegami
2个回答

5

-M-m开关不适用于 Perl 脚本内部使用。

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

$ perl -Mdiagnostics shebang.pl

在第1行的位置已经为"-Mstrict"选项太晚了 (#1) (X) 在Perl脚本中,#! 行(或等效行)包含 -M、-m 或 -C 选项。
对于-M和-m,这是一个错误,因为这些选项不打算在脚本内使用。请改用use pragma。
只有在命令行上指定了相同的字母或数字序列时,-C选项才起作用。要么在命令行上指定此选项,要么,如果您的系统支持,则将脚本设置为可执行文件并直接运行它,而不是将其传递给perl。
用户代码未捕获的异常: 在第1行的位置已经为"-Mstrict"选项太晚了。

1
我认为原帖作者已经意识到 -M 不应该在那里使用,并且他们想知道为什么。 - ikegami

4

这是一个有意的警告,不是加载失败。他们想要阻止你尝试在 shebang 行上加载模块,即使它(有时)实际上是可行的。这是因为Perl不能保证OS解释和执行脚本的shebang行的方式。因此,它是被禁止的。请参考perlrun了解更多信息。Perl实际上会在启动后重新解析shebang行,以检查在执行时未正确传递的选项。

$ cat script.pl
#!/usr/bin/perl -w -Mthing print "Hello world\n"; $ cat thing.pm
package thing; $|=1; print "thing was loaded\n"; sub import { print "thing import was imported\n"; } $ ./script.pl thing was loaded thing import was imported Too late for "-Mthing" option at ./script.pl line 1. $ perl ./script.pl Too late for "-Mthing" option at ./script.pl line 1. $ perl -x ./script.pl thing was loaded thing import was imported Hello world

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接