0

这是 usex.pl:

#use strict;
require 'x.pl';
print $x;

这是x.pl:

#use strict;
our $x = 99;
1;

如图所示,它运行良好。如果我取消注释在 usesx.pl 中使用 strict 的行,我会得到

Global symbol "$x" requires explicit package name

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

我对 Perl 还很陌生。为什么 strict 使 $x 在主脚本中不可见,对此的正常解决方案是什么?

4

2 回答 2

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";
于 2012-04-12T18:17:09.490 回答
5

呵呵,our因为它混合了全局和词法范围的概念,所以不容易理解。它所做的是将全局变量从strict 'vars'pragma 中排除,并允许在其范围内对其进行非限定访问,即封闭块或当前文件的结尾,无论先出现什么。阅读手册中的完整(但简短)故事,也可以通过perldoc -f our在命令行中说来访问。

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

use strict;
require 'x.pl';
print $main::x;
于 2012-04-12T18:01:05.643 回答