尝试通过Perl中的词法绑定来本地化外部包变量

这是一个很长的标题,但我担心在不失去问题的真正含义的情况下我不能说出一个字.我将简要介绍一下我首先想要实现的目标,然后对我为什么希望以这种方式完成这一过程进行漫长的漫游.如果您打算直接回答遵守问题标题,请跳过漫步:-)

简要说明

假设存在一个符合我想要的lexicalize内置,这里有:

package Whatever;
{
  lexicalize $Other::Package::var;
  local $var = 42;
  Other::Package->do_stuff; # depends on that variable internally
}

为什么和whynots

对于一些上下文,我是白盒测试第三方模块.

我希望变量本地化,因为我希望它在有限的时间内更改,然后测试继续进行其他操作.本地是我发现这样做的最佳方式,而不依赖于知道模块对初始值的选择.

我想要一个词法绑定有两个主要原因:

>我不想污染测试文件的更高级别的命名空间.
>我想要比完全限定名称短的东西.为简洁起见,它不在示例代码中,但我使用的标识符比显示的更多,其计算和更新相对于其先前的值.

我无法正常使用我们因为它不会从另一个包中获取变量:“没有包名称允许变量$Other :: Package :: var in”my“.”作弊暂时输入其他::包的范围不切断它:如果我使用一个块({package Other :: Package;我们的$var}),那么绑定的持续时间不够长;如果我不这样做(打包Other :: Package;我们的@var;包main),那么我需要知道并复制以前的包名,这样可以防止过多地移动那段代码.

在询问此问题的前一种形式之前做完作业时,我发现了Lexical :: Var,这看起来就像我需要的那样.唉:“不能通过引用进行本地化.”

我也尝试过我对基于* var的表单的直觉,但不断遇到语法错误.我今天学到了更多关于范围和约束的知识:-)

我想不出为什么我想要的东西不可能,但我找不到正确的咒语.我要求一个不幸的未实现的边缘案例吗?

解决方法

我不太确定我是否理解正确.这有帮助吗?

#!/usr/bin/env perl

{
    package This;
    use warnings; use strict;
    our $var = 42;

    sub do_stuff {
        print "$var\n";
    }
}

{
    package That;
    use warnings; use strict;

    use Lexical::Alias;
    local $This::var;

    alias $This::var,my $var;

    $var = 24;
    print "$var\n";

    This->do_stuff;
}

package main;

use warnings; use strict;

This->do_stuff;

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...