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

标签 perl import module global-variables

我需要全部导入我们的来自 的变量未命名 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 strictuse warnings因为如果你把它们放在你的程序中,它们就会尖叫着跑出去,蜷缩在角落里歇斯底里地哭泣。

我从来没有,我不是说几乎从来没有,从不导出变量。我总是创建一种方法来提取所需的值。它使我能够对我向外界公开的内容进行重要控制,并保持用户的命名空间纯净。

让我们看看您的想法可能存在的问题。

  • 您不知道模块中导出了什么。使用该模块的程序如何知道要使用什么?在某处,您必须记录变量 $foo@bar可供使用。如果你必须这样做,为什么不简单地安全行事呢?
  • 您遇到有人更改模块的问题,突然一个新变量正在使用该模块导出到程序中。想象一下,如果该变量已经在使用中。程序突然出现了一个错误,你永远无法弄清楚。
  • 您正在导出模块中的变量,开发人员决定修改该变量,甚至将其从程序中删除。同样,因为您不知道正在导入或导出什么,所以无法知道程序中突然出现错误的原因。

  • 正如我提到的,你 要知道程序可以使用的模块中正在使用的东西,所以无论如何你都必须记录它。如果你要坚持导入变量,至少使用 EXPORT_OK数组和导出器模块。这将有助于限制损害。这样,您的程序可以声明它所依赖的变量,并且您的模块可以声明它知道程序可能正在使用的变量。如果我正在修改模块,我会格外小心看到我正在导出的任何变量。而且,如果您必须在程序中指定要导入的变量,您就知道要谨慎对待这些特定变量。

    否则,为什么要打扰模块呢?为什么不直接回到 Perl 3.0 并使用 require而不是 use忘记使用 package陈述。

    关于perl - 如何从未命名的 Perl 模块导入所有 "our"变量而不列出它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7391327/

    相关文章:

    perl - 使用表示哈希结构的字符串访问哈希引用数据

    python - 类名与文件/模块名相同导致继承问题

    module - 在 fortran 中编写模块的正确方法

    typescript 。导入 "module/subdirectory"npm 包时未找到环境声明

    Java EE 应用程序服务器和 Perl 脚本

    PNG 的 IDAT block 上的 PHP shell

    algorithm - DAG : Self referencing HASH: searching the first level parent from any level child and then search leaves of that parent

    python - 为项目导入库

    scala - 我可以在Scala中一次从多个软件包中导入吗?

    java - 在Java中更改导入名称,或导入两个同名的类