为什么严格抱怨所需的其他脚本中的变量?

Dar*_*enW 0 perl perl-module strict require

这是usex.pl:

#use strict;
require 'x.pl';
print $x;
Run Code Online (Sandbox Code Playgroud)

这是x.pl:

#use strict;
our $x = 99;
1;
Run Code Online (Sandbox Code Playgroud)

如图所示,它运行正常.如果我取消注释usex.pl中使用strict的行,我得到

Global symbol "$x" requires explicit package name
Run Code Online (Sandbox Code Playgroud)

在x.pl中使用或不使用strict似乎并不重要(除非我删除'our'关键字,但我对此不感兴趣.)

我是Perl的新手.为什么严格使$ x在主脚本中不可见,这是什么正常的解决方案?

ike*_*ami 7

两个原因.

  1. 错误发生在编译时,在require执行之前.这很容易修复使用BEGIN.

  2. our是词法范围的,并且它在不同的词法范围(文件或块)中print,因此它不再有效.

整个方法从根本上说是糟糕的.这是一个更好的方法:

package MyConfig;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( $x );
our $x = 123;
1;

use strict;
use warnings;
use MyConfig;
print "$x\n";
Run Code Online (Sandbox Code Playgroud)


Lum*_*umi 5

呵呵,our因为它混合了全球和词汇范围的概念,所以不容易理解.它的作用是从免除的全局变量strict 'vars'编译,并允许其范围,这是封闭块,或者当前文件的末尾,无论第一自带内不合格的访问.阅读手册中的完整(但简短)故事,也可以通过perldoc -f our命令行说明.

至于您的脚本,您可以通过修改变量访问器来使用包限定名称来验证手册中单词的真实性:

use strict;
require 'x.pl';
print $main::x;
Run Code Online (Sandbox Code Playgroud)