gpt4 book ai didi

perl - 尝试通过 Perl 中的词法绑定(bind)本地化外部包变量

转载 作者:行者123 更新时间:2023-12-04 23:07:30 24 4
gpt4 key购买 nike

标题很长,但恐怕我一个字都说不出来,又不失问题的真意。我将先简要描述一下我想要实现的目标,然后再详细说明我为什么要这样做。如果您打算直接回答问题标题,请跳过漫无边际:-)

简要说明

假设存在 lexicalize内置的正是我想要的,这里是:

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

为什么和为什么不

对于一些上下文,我正在对第三方模块进行白盒测试。

我想要变量 本地化 因为我希望它只在有限的时间内更改,然后再进行其他测试。 local是我发现做到这一点的最好方法,而不依赖于知道模块对初始值的选择。

我想要一个 词法绑定(bind) 主要有两个原因:
  • 我不想污染测试文件的上层命名空间。
  • 我想要比完全限定名称更短的名称。为简洁起见,它不在示例代码中,但我使用的标识符比显示的要多得多,计算和更新是相对于它的先前值。

  • 我不能正常使用 our因为它不会从另一个包中获取变量:“No package name allowed for variable $Other::Package::var in "our".”作弊暂时进入 Other::Package 的范围并没有减少它:如果我使用一个 block ( { package Other::Package; our $var } ),那么绑定(bind)的持续时间不够长而无法使用;如果我不这样做( package Other::Package; our @var; package main ),那么我需要知道并复制前一个包的名称,这样可以防止过多地移动那段代码。

    在问这个问题的以前形式之前做功课时,我发现 Lexical::Var ,这似乎正是我所需要的。唉:“无法通过引用进行本地化。”

    我也尽了最大的努力来处理 my *var 的直觉。 -based 形式,但不断遇到语法错误。我今天学到的关于范围界定和绑定(bind)的知识比我关心的要多:-)

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

    最佳答案

    如果我说对了,您所需要的就是我们的。如果我不这样做,请原谅我。

    这是工作示例:

    #!/usr/bin/env perl
    use strict;
    use warnings;

    package Some;

    our $var = 42;
    sub do_stuff { return $var }

    package main;

    {
    local $Some::var = 43;
    print "Localized: " . Some->do_stuff() . "\n";
    };

    print "Normal: " . Some->do_stuff() . "\n";

    但是,如果您尝试本地化某个包的私有(private)( my )变量,您可能做错了什么。

    关于perl - 尝试通过 Perl 中的词法绑定(bind)本地化外部包变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7799085/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com