我使用
UNITCHECK
编写了一些 Perl 包(主要是为了确保某些更改不会破坏它)。
由于某些检查“繁重”(例如创建临时数据库或等待时间过去),因此在某些情况下我不希望执行检查(例如使用此类包时。
我想知道:是否有一种方法可以有条件地禁用执行
UNITCHECK
块,而不需要更改包源?
我可以想到类似的东西
our $DISABLE_UNITCHECK = 0;
#...
UNITCHECK {
unless ($DISABLE_UNITCHECK) {
# all the UNITCHECK code goes here
}
}
但是如何巧妙地设置变量呢? 让它变得棘手的是,
UNITCHECK
仅在第一次加载包时运行一次,对吗?
阅读评论后我想出了这个解决方案:
默认情况下,该包不会使用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
令牌应用于以递归方式使用的模块。