一个用于更好调试的 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。

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