perl – 使用严格的空列表等同于不使用strict?

前端之家收集整理的这篇文章主要介绍了perl – 使用严格的空列表等同于不使用strict?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
TLDR:查看问题标题.

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的整个效果.

原文链接:https://www.f2er.com/Perl/171552.html

猜你在找的Perl相关文章