如何在perl中的本地范围内访问导入模块中的变量?

2024-03-29

我在创建 perl Moose 模块时陷入困境。

我有一个全局 pm 模块。

package XYZ;
require Exporter;
our @ISA = qw(Exporter);  ## EDIT missed this line 
our @EXPORT_OK = qw($VAR);
my $VAR1 = 1;
our $VAR = {'XYZ' => $VAR1};
1;

我想要得到$VAR in a Moose我正在创建的模块

package THIS;
use Moose;
use YAML::XS;
sub get_all_blocks{
  my ($self) = @_;
  require $self->get_pkg(); # this returns the full path+name of the above package
  # i cannot use use lib+use since the get_pkg starts complaining 

  our $VAR;
  print YAML::XS::Dump($XYZ::VAR); # this works
  print YAML::XS::Dump($VAR); # this does not work
  # i cannot use the scope resolution since XYZ would keep changing.

}
1;

有人可以帮我访问变量吗?

编辑:遗漏了一行package XYZ代码。 我无法触摸package XYZ因为它是由其他人拥有/使用的,所以我可以使用它:(


导出变量很容易导致麻烦。

Why not

package XYZ;

use strict;
use warnings;

use Exporter qw(import);
our @EXPORT_OK = qw(get_var);

my $VAR = '...';  # no need for "our" now

sub get_var { return $VAR }
...
1;

and then

package THIS;

use warnings;
use strict;

use XYZ qw(get_var);

my $var = get_var();    
...
1;

See Exporter http://perldoc.perl.org/Exporter.html.

至于你试图做什么,有两个直接问题

  • $VAR from XYZ is never imported into THIS. If you need symbols from other packages you need to import them. Those packages have to make them available first, so you need to add it to @EXPORT_OK as well. Like above but with $VAR instead of get_var()

    package XYZ;
    ...
    use Exporter qw(import);
    our @EXPORT_OK = qw($VAR);
    
    our $VAR = '...';  # need be "our" for this
    

    with

    package THIS;
    ...
    use XYZ qw($VAR);
    
    print "$VAR\n";
    

    Now $VAR可以直接使用,包括正在写信给(除非声明为常量);它可以在其他代码的脚下改变它的值,而其他代码甚至可能永远不知道其中的任何一个。

    另一种方法是使用@EXPORT然后这些符号被引入到每个程序中use Package;。我强烈建议只使用@EXPORT_OK,当呼叫者需要明确列出他们想要的内容时。这也很好地记录了正在使用的内容。

  • 即使添加了该内容,仍然存在一个同名变量THIS,隐藏(遮罩、阴影)$XYZ::VAR。所以删除our $VAR in THIS。这是全局变量问题的一个很好的例子。一旦它们被引入我们就必须小心它们always and 到处.

但跨模块共享变量存在更大的问题。

它使代码组件变得纠缠在一起,并且代码变得越来越难使用。它违背了明确定义的范围和模块化设计的原则,它支持远距离操作等。Perl 提供了许多用于构建代码的好工具,我们很少需要全局变量和共享变量。它告诉我们的是Exporter itself 警告不要这样做 http://perldoc.perl.org/Exporter.html#What-Not-to-Export.

Note how now my $VAR in XYZ is not visible outside XYZ; there is no way for any code outside XYZ to know about it or to access it. When it is our then any code in the interpreter can write it simply as $XYZ::VAR, and without even importing it; that's what we don't want.

当然,可能需要或很好地使用导出变量,这些变量偶尔可以在模块中找到。但这是一个例外,请谨慎使用。


Unless they're declared as package globals under a lexical alias via our https://perldoc.perl.org/functions/our in their package https://perldoc.perl.org/functions/package, in which case they can be used anywhere as $TheirPackageName::varname.

This complete privacy is courtesy of my https://perldoc.perl.org/perlsub#Private-Variables-via-my%28%29.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在perl中的本地范围内访问导入模块中的变量? 的相关文章

  • 在 Perl eval 中捕获变量赋值

    我希望能够从 Perl eval 捕获变量赋值 也就是说 确定代码中分配给哪些变量名称并提取它们的值 例如 如果我运行 eval foo 42 bar 3 14 eval 的结果是 3 14 最后评估的值 但我还希望能够确定名称 foo 和
  • 如何指定 Perl 的 Inline::Python 模块正在使用的 Python 版本?

    我正在运行 Debian squeeze 和 perl v5 10 1 并且安装了两个版本的 python pyversions i python2 5 python2 6 Python Inline显然使用python2 5 perl u
  • 同一个字符可以有 2 种不同的 UTF-8 编码吗?

    我正在编写一个应用程序 需要将其输入从 UTF 8 转码为 ISO 8859 1 Latin 1 一切正常 除了有时我会得到一些变音字符的奇怪编码 例如 带有 2 个点的拉丁语 1 E 0xEB 通常为 UTF 8 0xC3 0xAB 但有
  • 如何提高非持久 CGI 进程中的 Moose 性能?

    Moose http search cpan org dist Moose 是一个很棒的对象框架 问题在于 连同它的依赖项一起 它是very大的 我们的分析表明 在我们的平台上 仅加载 Moose 就会在非持久性 CGI 应用程序脚本上产生
  • 在 Perl 中使用 POSIX ceil() 出现意外结果

    我一生都无法弄清楚为什么以下会产生这样的结果 use POSIX my g 6 65 my t g 4 my r t g my n r g my c ceil n print c n n 我知道印记太棒了 抱歉 我已经为我的应用程序解决了这
  • 首选的跨平台 IPC Perl 模块是什么?

    我想创建一个简单的 IO 对象 它代表一个向另一个程序打开的管道 我可以在应用程序运行时定期写入另一个程序的 STDIN 我希望它是防弹的 因为它可以捕获所有错误 并且是跨平台的 我能找到的最佳选择是 open sub io read lo
  • 如何删除 XML::Simple 输出中的 标记?

    我正在使用 Perl 创建一个 XML 文件 XML 简单 http search cpan org dist XML Simple模块 我成功创建了 XML 文件 但问题是我遇到了
  • 如何使用 Perl 从纯文本中提取 URL?

    我需要 Perl 正则表达式来解析纯文本输入并将所有链接转换为有效的 HTML HREF 链接 我已经尝试了在网上找到的 10 个不同版本 但没有一个可以正常工作 我还测试了 StackOverflow 上发布的其他解决方案 但似乎都不起作
  • Perl 使用什么哈希函数/算法?

    有人能解释一下 Perl 用于将字符串映射到索引的哈希函数 算法吗 有相关读物吗 这个答案早于 5 28 中进行的哈希函数更改 请参阅 默认哈希函数更改 perldelta 为 5 28 http perldoc perl org perl
  • 使用perl求中位数、众数、标准差?

    我有一个数字数组 计算数据集的中位数 众数和标准差的最简单方法是什么 Statistics Basic Mean http p3rl org Statistics Basic Mean Statistics Basic Median htt
  • 如何在 Perl 中访问名称包含在变量中的常量?

    我有一组用 Perl 声明的常量 use constant C1 gt 111 use constant C2 gt 222 use constant C9 gt 999 my which constant C2 我如何构造一个 Perl
  • 我应该如何使用 Perl URI 类?

    我需要在 Perl 程序中处理一些 HTTP URL 但我怀疑应该如何处理URI https metacpan org module URI类帮助我 特别是 我想使用URI用于解析相对 URL 并获取其组件的类 然而 问题是 我需要一个可以
  • 在 Perl 中验证电子邮件的正则表达式

    我是 Perl 新手 正在尝试掌握脚本语言 其中我遇到了正则表达式来验证电子邮件地址 我正在分享 perl 脚本 我不确定我在哪里犯了错误 部分始终被省略 随后正确的电子邮件 ID 也显示为无效 这是代码 usrs bin perl str
  • 不区分大小写的关键字匹配

    我正在编写一种用于解析计算机语言的语法 可以与解析 Eyapp http search cpan org casiano Parse Eyapp 1 182 lib Parse Eyapp pod 这是一个 Perl 包 可以简化常规语言解
  • Perl 命令或模块,如 Linux“文件”命令

    我有一个下载文件的脚本 但这些文件在下载之前没有任何有关它们的信息 在为 Linux 编写代码时 我刚刚调用了qx file filename 查看它是否是 JPEG 图像 如果不是则将其删除 然而 我现在正尝试重写为独立于平台的纯 Per
  • 我能否确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行?

    Perl 5 10 和 5 12 的一些新功能 例如 say 被定义为功能 您可以使用 feature 编译指示显式启用或禁止这些功能 但其他添加 例如正则表达式的命名捕获组 是隐式的 当我使用 5 10 解释器编写 Perl 但希望它也能
  • Perl:避免从标准输入贪婪读取?

    考虑以下 perl 脚本 read pl my line
  • perl xs - 从 c 数组返回 perl 数组

    使用 XS 我尝试将值从 C 数组传递到可在脚本中使用的 Perl 数组 这是我的 xs 文件中的代码 AV DoubleArray getPerlArray CODE r newAV for size t i 0 i lt THIS gt
  • 如何设置 $!在 Perl 中

    我想在 perl 中编写一些设置 的函数 与内置 perl 函数类似 当我尝试执行此操作时 它抱怨 参数 无法创建管理员用户 在标量分配中不是数字 我试过用谷歌搜索这个 但不幸的是谷歌不会在 所以结果很难得到 if createUser a
  • 使用 Perl 计算字符串中的连续字符数

    我有一个包含多个连续字符序列的字符串 例如 aaabbcccdddd 我想将其表示为 a3b2c3d4 到目前为止 我已经想出了这个 usr bin perl str aaabbcccdddd str s 1 1 g print str n

随机推荐