用于更好调试的 Perl 模块

这个简单而优雅的模块允许您包含仅用于调试或开发环境的 Perl 代码,但在生产环境中隐藏它。
306 位读者喜欢这个。
annoying bugs

Opensource.com

有时,拥有一段仅用于调试或开发调整的 Perl 代码块非常有用。这很好,但是拥有这样的代码块可能会对性能造成很大的影响,特别是如果是否执行它的决定是在运行时做出的。

Curtis "Ovid" Poe 最近编写了一个模块,可以帮助解决这个问题:Keyword::DEVELOPMENT。该模块利用 Keyword::Simple 和 Perl 5.012 中引入的可插拔关键字架构来创建一个新的关键字:DEVELOPMENT。它使用 PERL_KEYWORD_DEVELOPMENT 环境变量的值来确定是否执行代码块。

使用它再简单不过了

use Keyword::DEVELOPMENT;
	
sub doing_my_big_loop {
    my $self = shift;
    DEVELOPMENT {
        # insert expensive debugging code here!
    }
}

在编译时,DEVELOPMENT 代码块内的代码被优化掉,根本不存在。

您看到这里的优势了吗?在您的沙箱环境中将 PERL_KEYWORD_DEVELOPMENT 环境变量设置为 true,在您的生产环境中设置为 false,有价值的调试工具就可以提交到您的代码仓库中,在您需要它们时随时可用。

您还可以使用此模块,在缺乏更完善的配置管理系统的情况下,处理生产环境、开发环境或测试环境之间设置的差异

sub connect_to_my_database {
	
    my $dsn = "dbi:mysql:productiondb";
    my $user = "db_user";
    my $pass = "db_pass";
    
    DEVELOPMENT {
        # Override some of that config information
        $dsn = "dbi:mysql:developmentdb";
    }
    
    my $db_handle = DBI->connect($dsn, $user, $pass);
}

稍后对此代码段的增强功能将让您从其他地方(可能来自 YAML 或 INI 文件)读取配置信息,但我希望您能看到这里的实用性。

我查看了 Keyword::DEVELOPMENT 的源代码,花了大约半个小时思考,“天哪,我为什么没想到呢?” 一旦安装了 Keyword::Simple,Curtis 给我们的模块就非常简单了。对于我长期以来在自己的编码实践中需要的东西,这是一个优雅的解决方案。

User profile image.
Ruth Holloway 长期以来一直是一名系统管理员和软件开发人员,早在很久以前就在 VAX 11/780 上开始了她的职业生涯。她职业生涯的大部分时间(到目前为止)都在为图书馆提供技术需求服务,并且自 2008 年以来一直是 Koha 开源图书馆自动化套件的贡献者。Ruth 目前是 Clearbuilt 的 Perl 开发人员和项目负责人。

5 条评论

这听起来像是包含调试代码的一种非常有前途的方法。
但是您永远不应该硬编码配置数据,更不用说混合生产和测试配置。那会给您带来麻烦......很大的麻烦。

三十年的代码编写经验;我非常清楚硬编码配置信息会发生什么。这就是为什么我说,“在缺乏更完善的配置管理系统的情况下。” 我经历过许多项目,它们最初都类似于这样,然后迭代并获得了更强大的配置管理系统,随着项目的需求变得更加清晰。

回复 作者 Hendrik T. Voelker (未验证)

我想知道这种方法是否可以用来创建一个满足不同用途的单个 Perl 程序,而不仅仅是作为调试工具。

这似乎是一个很好的技术,谢谢您分享 Ruth。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.