当前位置: 首页 > news >正文

一个可以更好地调试的 Perl 模块

仅用于调试或开发调整时的 Perl 代码块有时会很有用。这很好,但是这样的代码块可能会对性能产生很大的影响, 尤其是在运行时才决定是否执行它。

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

使用它不能更容易了:

 
 
  1. use Keyword::DEVELOPMENT;
  2. sub doing_my_big_loop {
  3. my $self = shift;
  4. DEVELOPMENT {
  5. # insert expensive debugging code here!
  6. }
  7. }

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

你看到好处了么?在沙盒中将 PERL_KEYWORD_DEVELOPMENT 环境变量设置为 true,在生产环境设为 false,并且可以将有价值的调试工具提交到你的代码库中,在你需要的时候随时可用。

在缺乏高级配置管理的系统中,你也可以使用此模块来处理生产和开发或测试环境之间的设置差异:

 
 
  1. sub connect_to_my_database {
  2. my $dsn = "dbi:mysql:productiondb";
  3. my $user = "db_user";
  4. my $pass = "db_pass";
  5. DEVELOPMENT {
  6. # Override some of that config information
  7. $dsn = "dbi:mysql:developmentdb";
  8. }
  9. my $db_handle = DBI->connect($dsn, $user, $pass);
  10. }

稍后对此代码片段的增强使你能在其他地方,比如 YAML 或 INI 中读取配置信息,但我希望您能在此看到该工具。

我查看了关键字 Keyword::DEVELOPMENT 的源码,花了大约半小时研究,“天哪,我为什么没有想到这个?”安装 Keyword::Simple 后,Curtis 给我们的模块就非常简单了。这是我长期以来在自己的编码实践中所需要的一个优雅解决方案。


原文发布时间为:2018-05-21

本文来自云栖社区合作伙伴“Linux中国开源社区”,了解相关信息可以关注“Linux中国开源社区”。

相关文章:

  • 系统认识JavaScript正则表达式
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 深入理解linux系统下proc文件系统内容
  • Servlet容器启动过程
  • 序列化有关内容
  • 30亿元收购比特币公司 鲁亿通称不是炒概念
  • [译] android应用开发者,你们真的了解Activity的生命周期吗?
  • 分布式系统的经典基础理论
  • 如何在工作中学习
  • 实现自动SSH连接
  • 以太坊教程:搭建环境、编写编译一个智能合约
  • 微信小程序第三方开发需要注意的点
  • SSH配置免秘钥登录
  • 【VS】使用vs2017自带的诊断工具(Diagnostic Tools)诊断程序的内存问题
  • 浅谈Golang中select的用法
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CentOS 7 防火墙操作
  • co.js - 让异步代码同步化
  • express如何解决request entity too large问题
  • JDK 6和JDK 7中的substring()方法
  • php中curl和soap方式请求服务超时问题
  • python docx文档转html页面
  • Vue.js-Day01
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前嗅ForeSpider采集配置界面介绍
  • 区块链将重新定义世界
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习JavaScript数据结构与算法 — 树
  • 学习笔记:对象,原型和继承(1)
  • #QT(串口助手-界面)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (solr系列:一)使用tomcat部署solr服务
  • (八)Flask之app.route装饰器函数的参数
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (一)appium-desktop定位元素原理
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET CORE Aws S3 使用
  • .NET Standard 的管理策略
  • .pop ----remove 删除
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @Documented注解的作用
  • @取消转义
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • []常用AT命令解释()
  • [20140403]查询是否产生日志
  • [android] 天气app布局练习
  • [C#]猫叫人醒老鼠跑 C#的委托及事件
  • [C/C++]关于C++11中的std::move和std::forward
  • [C++]C++基础知识概述
  • [C++进阶篇]STL中vector的使用
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [java/jdbc]插入数据时获取自增长主键的值
  • [LeetCode] Merge Two Sorted Lists