我有一个尊重的Perl脚本x.pl
如下:
#!/usr/bin/env -S perl -Mstrict -wp
s/a/b/;
如果我使用
./x.pl
或perl x.pl
来运行它,它会崩溃。Too late for "-Mstrict" option at ./x.pl line 1.
但是...为什么?我以为“太晚了......”只是-CSDA
或-T
等问题,因为“流已经打开”。此外,难道shebang行不是用指定的开关调用perl吗?
-M
和-m
开关不适用于 Perl 脚本内部使用。
#!/usr/bin/perl -Mstrict
# shebang.pl
print 42;
$ perl -Mdiagnostics shebang.pl
-M
不应该在那里使用,并且他们想知道为什么。 - ikegami这是一个有意的警告,不是加载失败。他们想要阻止你尝试在 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
我同意现在这种方式有点过时,但它是将操作系统执行与程序分离的一种方法。
use strict;
有关。只需使用use strict;
! - ikegami