【发布时间】:2011-12-09 14:09:01
【问题描述】:
标题很长,但我恐怕一个字都说不出来,又不失问题的真意。我将简要介绍一下我首先要实现的目标,然后再详细说明我为什么要以这种方式完成。如果您打算按照问题标题直接回答,请跳过漫谈:-)
简要说明
假设存在一个可以满足我要求的 lexicalize 内置函数,如下所示:
package Whatever;
{
lexicalize $Other::Package::var;
local $var = 42;
Other::Package->do_stuff; # depends on that variable internally
}
为什么和为什么不
就上下文而言,我正在对第三方模块进行白盒测试。
我希望变量本地化,因为我希望它只在有限的时间内更改,然后再进行其他测试。 local 是我发现的最好的方法,它不需要知道模块选择的初始值。
我想要一个词法绑定有两个主要原因:
- 我不想污染测试文件的高级命名空间。
- 我想要比完全限定名称更短的名称。为简洁起见,它不在示例代码中,但我使用的标识符比显示的要多得多,计算和更新都与之前的值有关。
我不能正确地使用our,因为它不会从另一个包中获取变量:“No package name allowed for variable $Other::Package::var in "our".”作弊暂时进入 Other::Package 的范围并没有减少它:如果我使用一个块 ({ package Other::Package; our $var }),那么绑定的持续时间不够长,无法使用;如果我不这样做 (package Other::Package; our @var; package main),那么我需要知道并复制前一个包的名称,这样可以防止过多地移动那段代码。
在问这个问题之前的形式之前做功课时,我发现了Lexical::Var,这似乎正是我需要的。唉:“无法通过引用进行本地化。”
我也尽我最大的努力对基于my *var 的表单的直觉,但不断遇到语法错误。今天我学到的关于范围界定和绑定的知识比我关心的要多:-)
我想不出为什么我想要的东西不应该是可能的,但我找不到正确的咒语。我是在要求一个不幸的未实现的边缘案例吗?
【问题讨论】:
标签: perl variables internals lexical-scope