在original version of a question中,使用strict();在程序的顶部.没有变量与我的声明.程序工作我指出,代码不会因为失踪的人而工作,但事实证明我是错误的.
$perl e 'use strict (); $foo = 1'
这个程序工作.它不会崩溃但显然这是崩溃:
$perl -e 'use strict; $foo = 1' Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at -e line 1. Execution of -e aborted due to compilation errors.
我的第一个想法是贬低它,看看是否还有其他事情发生.
$perl -MO=Deparse -e 'use strict (); $foo = 1' use strict (); $foo = 1; -e Syntax OK
但不是.然后它让我想到,你可以使用严格的“vars”,这只会打开vars thing1.这显然是通过调用import
.
使用strict与BEGIN {require strict; strict->进口; },所以模块的规则也适用于pragmata.如果我使用Foo(),则不会导入任何内容.因此,使用strict();应该与require strict相同,只是在运行时,因为没有任何进口.
$perl -e 'require strict; $foo = 1'
这不会崩溃.但是在运行时你不能打开在编译时设置的东西.
那么这实际上是做什么的呢?当Perl达到我的实际代码时,它可能已经在其他地方遇到了严格的pragma,所以它不会再加载它.它不会导入任何东西.
$perl -e 'print %INC'
哎呀.这没有打印. %INC为空.但是如果我们使用另一个模块,那里有一些东西.
$perl -MData::Dumper -e 'print Dumper \%INC' $VAR1 = { 'warnings.pm' => '/usr/share/perl/5.22/warnings.pm','overload.pm' => '/usr/share/perl/5.22/overload.pm','Carp.pm' => '/usr/share/perl/5.22/Carp.pm','strict.pm' => '/usr/share/perl/5.22/strict.pm','overloading.pm' => '/usr/share/perl/5.22/overloading.pm','constant.pm' => '/usr/share/perl/5.22/constant.pm','bytes.pm' => '/usr/share/perl/5.22/bytes.pm','Data/Dumper.pm' => '/usr/lib/x86_64-linux-gnu/perl/5.22/Data/Dumper.pm','XSLoader.pm' => '/usr/share/perl/5.22/XSLoader.pm','Exporter.pm' => '/usr/share/perl/5.22/Exporter.pm','warnings/register.pm' => '/usr/share/perl/5.22/warnings/register.pm' };
如果我们加载Data :: Dumper,在某些时候加载了strict.但不是在纯粹的例子中.
$perl -e 'use strict (); print %INC' strict.pm/usr/share/perl/5.22/strict.pm
好.这加载strict.pm.
$perl -e 'require strict; print %INC' strict.pm/usr/share/perl/5.22/strict.pm
那么这样呢但是,仍然没有一个严格的事情被启用.
所以问题真的是,使用strict()相当于根本没有使用strict语句,还是有其他的事情发生?
1)perldoc strict指严格可以采取的三个不同论点
解决方法
use strict ();
(基本上)没有做任何事情:见the docs:
If you do not want to call the package’s import method (for instance,to stop your namespace from being altered),explicitly supply the empty list:
use Module ();
That is exactly equivalent to
BEGIN { require Module }
当然,严格只做一些事情,如果你调用它的import方法(你可以很容易地通过读取它的源代码来验证,它只有大约150行).所以绕过导入方法会绕过使用strict的整个效果.