如何有条件地禁用 UNITCHECK 块?

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

我使用

UNITCHECK
编写了一些 Perl 包(主要是为了确保某些更改不会破坏它)。 由于某些检查“繁重”(例如创建临时数据库或等待时间过去),因此在某些情况下我不希望执行检查(例如使用此类包时。

我想知道:是否有一种方法可以有条件地禁用执行

UNITCHECK
块,而不需要更改包源?

我可以想到类似的东西

our $DISABLE_UNITCHECK = 0;
#...
UNITCHECK {
    unless ($DISABLE_UNITCHECK) {
        # all the UNITCHECK code goes here
    }
}

但是如何巧妙地设置变量呢? 让它变得棘手的是,

UNITCHECK
仅在第一次加载包时运行一次,对吗?

unit-testing perl package
1个回答
0
投票

阅读评论后我想出了这个解决方案: 默认情况下,该包不会使用UNITCHECK

,但如果导入“神奇”
UNITCHECK
符号(即:
use Package qw(UNITCHECK)
),则会使用它。
但是,您无法在导入任何内容时启用 
UNITCHECK
(即:
use Package qw(UNITCHECK)
 将导入默认集)。

这是代码片段:

#!/usr/bin/perl use warnings; use strict; package Package; our (@EXPORT, @ISA, $VERSION); BEGIN { use Exporter; $VERSION = 'v0.0.0'; # for version checking @ISA = qw(Exporter); #@EXPORT = ... } our $UNITCHECK = 0; sub import { @_ = grep { if ($_ eq 'UNITCHECK') { $UNITCHECK = 1; 0 } else { 1 } } @_; # Exporter::import will export to the caller's namespace # (that would be __PACKAGE__). Using goto makes Exporter::import use # the caller of this import routine instead. Also pass original @_. goto &Exporter::import; } UNITCHECK { if ($UNITCHECK) { print "checking unit\n"; } } 1;
当然,要严格回答问题,会使用符号

NO_UNITCHECK

,默认为
$UNITCHECK = 1
,最终使用
grep
中的反转逻辑...

甚至可以扩展代码,使神奇的

(NO_)?UNITCHECK

 令牌应用于以递归方式使用的模块。

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