如何从未命名的Perl模块导入所有"我们的"变量而不列出它们?

lin*_*ild 9 import perl module global-variables

我需要进口所有我们从变量无名的Perl模块(Module.pm)和使用它们的Perl脚本(Script.pl)内.

以下代码在没有"use strict"的情况下运行良好,但是失败了.如何更改此代码以使用"use strict"而无需手动列出所有导入的变量(如其他问题的答案中所述)?

非常感谢你的帮助!

Script.pl:

use strict;
require Module;
print $Var1;
Run Code Online (Sandbox Code Playgroud)

Module.pm:

our $Var1 = "1\n";
...
our $VarN = "N\n";
return 1;
Run Code Online (Sandbox Code Playgroud)

运行脚本:

$> perl Script.pl
Run Code Online (Sandbox Code Playgroud)

错误:

Global symbol "$Var1" requires explicit package name at Script.pl line 3.
Execution of Script.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

注意(1):模块未命名,因此Module::不能使用前缀.

注(2):Module.pm还包含一组由全局变量配置的函数.

注(3):变量不同,不应存储在一个数组中.

注(4):设计不好,但问题不在于设计.这是强制列出的代码使用复杂性进行最小的修改O(1),即几行代码不依赖于N.

解决方案候选者(ACCEPTED):$::在所有导入的变量之前添加.它符合strict并允许代码中的my变量不同imported.

Can*_*ice 7

将您的脚本更改为:

use strict;
require Module;
print $Module::Var1;
Run Code Online (Sandbox Code Playgroud)

问题是$Var1它不在主命名空间中,而是在Module命名空间中.

编辑:正如下面的评论所指出的那样,你还没有命名你的模块(即它没有package Module;在顶部说明).因此,没有Module命名空间.将脚本更改为:

use strict;
require Module;
print $main::Var1;
Run Code Online (Sandbox Code Playgroud)

...允许脚本正确打印出来1\n.

  • 由于`$ Var1`位于"未命名"模块中,因为OP调用它,它位于`main`命名空间中.使用`$ main :: Var1`或甚至只是`$ :: Var1`访问以符合`strict`. (4认同)