我需要全部导入我们的来自 的变量未命名 Perl 模块 (Module.pm) 并在 Perl 脚本 (Script.pl) 中使用它们。
以下代码在没有 的情况下运行良好“使用严格” ,但失败了。如何更改此代码以使用 “使用严格”没有手动列出所有导入的变量(如 other question 的答案中所述)?
非常感谢你的帮助!
脚本.pl:
use strict;
require Module;
print $Var1;
模块.pm:
our $Var1 = "1\n";
...
our $VarN = "N\n";
return 1;
运行脚本:
$> perl Script.pl
错误:
Global symbol "$Var1" requires explicit package name at Script.pl line 3.
Execution of Script.pl aborted due to compilation errors.
注 (1) : 该模块未命名,因此使用
Module::
前缀不是选项。注 (2) :
Module.pm
还包含一组由全局变量配置的函数。注 (3) :变量是不同的,不应存储在一个数组中。
注 (4) : 设计不好,但问题不在于设计。这是关于强制列出的代码以最小的修改与复杂性
O(1)
一起工作,即不依赖 N
的几行代码.候选解决方案(已接受) : 添加
$::
在所有导入的变量之前。它符合 strict
并且还允许不同my
来自 imported
的变量在代码中。
最佳答案
你想从一个模块中导出所有变量,并且你想以一种你甚至不知道你在导出什么的方式来做这件事?忘记use strict
和 use warnings
因为如果你把它们放在你的程序中,它们就会尖叫着跑出去,蜷缩在角落里歇斯底里地哭泣。
我从来没有,我不是说几乎从来没有,从不导出变量。我总是创建一种方法来提取所需的值。它使我能够对我向外界公开的内容进行重要控制,并保持用户的命名空间纯净。
让我们看看您的想法可能存在的问题。
$foo
和 @bar
可供使用。如果你必须这样做,为什么不简单地安全行事呢? 正如我提到的,你 有要知道程序可以使用的模块中正在使用的东西,所以无论如何你都必须记录它。如果你要坚持导入变量,至少使用
EXPORT_OK
数组和导出器模块。这将有助于限制损害。这样,您的程序可以声明它所依赖的变量,并且您的模块可以声明它知道程序可能正在使用的变量。如果我正在修改模块,我会格外小心看到我正在导出的任何变量。而且,如果您必须在程序中指定要导入的变量,您就知道要谨慎对待这些特定变量。否则,为什么要打扰模块呢?为什么不直接回到 Perl 3.0 并使用
require
而不是 use
忘记使用 package
陈述。
关于perl - 如何从未命名的 Perl 模块导入所有 "our"变量而不列出它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7391327/