如何在不重构的情况下保留“use”模块相对于“use”模块的状态?

问题描述 投票:0回答:1

这是简化示例,并非实际情况。

目前我有一个实用程序模块(我们称之为 Z),它声明了许多函数并在变量中保存一些状态变量(我们称之为

Print
):

package Z;

use strict;
use warnings;

use feature qw(say);

our $Print;

sub test {
    say @_ if $Print;
}

1;

这显然是为了通过

use
ing 模块打开/关闭某些内容的打印。

这是一个实用模块,因此它被许多模块

use
所使用。例如,XY分别表示希望打印:

package X;

use strict;
use warnings;

use Z;

$Z::Print = 0; # Sets Z::Print to 0

sub f {
    Z::test(@_);
}

1;
package Y;

use strict;
use warnings;

use Z;

$Z::Print = 1; # Sets Z::Print to 1

sub f {
    Z::test(@_);
}

1;

显然,当 X 和 Y 都在同一脚本中时,这会导致问题,例如在这种情况下,Y 将通过全局更改

use
的值来“踩 X 的脚”:
Z::Print

#!/usr/bin/env perl

# test.pl

use strict;
use warnings;

use X;
use Y;

my $v = 0;

X::f($v);
Y::f($v);


我知道 Z 可以重构为一个类,并且我可以在 X 和 Y 中实例化 Z 的本地副本;目前这是不可取的,因为这需要大量工作;
  1. 在 X 和 Y 中保存状态变量来控制 Z 的行为会很好,但是这
  2. 需要对 Z 的函数进行大量重构;目前这也是不可取的; 我正在寻找上述解决方案的替代、更快的解决方案(如果有可能解决这个问题),即使我知道改变设计将是“正确”的解决方案。
  3. 我知道这对我来说可能是一个糟糕的设计选择。不过,这就是我现在的处境,我想知道是否有一个至少是暂时的、简单的出路。
  4. 我将不胜感激任何意见。谢谢你

perl perl-module
1个回答
0
投票

user@server ~/[REDACTED] (git)-[REDACTED] % ./test.pl 0 # X prints, unwanted 0 # Y prints, wanted

 
临时在每个从 local 调用函数的函数中设置变量的值,而不是在每个其他模块中全局设置它:
Z

所以你只需要重写 
sub f { local $Z::Print = 1; # Previous value will be restored when f returns Z::test(@_); }

X
,而不是
Y
    

© www.soinside.com 2019 - 2024. All rights reserved.