使用自动编译检查提升Perl生产力

Perl的命令行选项-c会让Perl检查程序的语法,但不会执行它(除了BEGIN、CHECK和UNITCHECK块中的代码——注意这些)。例如

$ perl -c lib/Devel/DidYouMean.pm
lib/Devel/DidYouMean.pm syntax OK

这很有用,但是每次都要输入它来检查程序或文件的语法,有点麻烦。

连续语法检查

在开发Catalyst网络应用程序时,我最喜欢的特性之一是使用测试服务器在开发过程中自动检查网络应用程序的语法。这节省了我的时间,因为我知道网络应用程序是否能编译,不必浪费时间打开浏览器,却得到错误。如果你在基于Unix的操作系统上工作,你可以为任何Perl程序(不仅仅是网络应用程序)实现类似的效果。watch程序可以自动运行检查命令。只需启动一个新的终端,并输入

$ watch 'perl -c lib/Devel/DidYouMean.pm'

得到以下输出

Every 2s perl -c lib/Devel/DidYouMean.pm           Sat Nov  8 2014

lib/Devel/DidYouMean.pm syntax OK

在这种情况下,我在监视lib/Devel/DidYouMean.pm文件,但你可以为任何你想要检查语法错误的Perl文件提供路径。默认情况下,watch会每2秒运行一次命令。所以如果我保存了一个有错误的文件更新,监视终端窗口会显示错误

Every 2.0s: perl -c lib/Devel/DidYouMean.pm           Sat Nov  8 2014

syntax error at lib/Devel/DidYouMean.pm line 122, near "} keys"

lib/Devel/DidYouMean.pm had compilation errors.

这让我能够在运行程序之前捕捉到错误,节省了时间。

在文本编辑器中检查语法

使用watch很有用,但我发现每次都要检查一个单独的终端窗口来知道我的程序是否能编译,有点烦人。另一种方法是直接在文本编辑器中运行命令。我将展示如何在vim中这样做,但这应该可以在任何具有保存事件且可以挂钩的文本编辑器中实现(例如Sublime TextEmacs的示例)。

将以下行添加到你的.vimrc文件中

autocmd BufWritePost *.pm,*.t,*.pl echom system("perl -Ilib -c " . '"' . expand("%:p"). '"' )

这个命令的作用是每次保存以.pm、.t或.pl结尾的文件时,vim都会在文件上运行检查语法命令,并将结果输出到当前窗口。使用以下vim命令重新加载你的.vimrc::so $MYVIMRC

现在你不必设置一个单独的终端窗口并监视文件;vim会立即通知你任何Perl文件在保存时是否有编译错误。更方便多了!

在Vim中的其他方法

几位读者联系我推荐Vim的Syntastic 插件手册)。Syntastic的一个优点是你可以链式编译检查:首先运行perl -c,如果它通过,然后运行Perl::Critic等。Syntastic还集成了许多其他语言的语法检查器,所以如果你选择Vim作为你的编辑器,你可能想看看它。

Syntastic的一个更简单的方法是使用Vim的内置编译器支持。在当前缓冲区中有一个Perl文件时,输入

:compiler perl
:make
:cope

这将在当前缓冲区上运行Perl的语法检查。Vim将输出读入错误列表,:cope命令显示它。你可以通过按回车键跳转到特定错误引用的行(手册)。

更新: 添加了BEGIN、CHECK、UNITCHECK块的警告。添加了Emacs链接和Vim方法的添加。2014-11-10

Vim autocmd示例更新以处理包含空格的文件路径。感谢Henry An的建议。2015-01-22

封面图片 © Alan Kotok 的图片已进行数字修改


本文最初发布于 PerlTricks.com

标签

David Farrell

David 是一位专业的程序员,他经常 推文博客 关于代码和编程的艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请帮助我们通过在 GitHub 上打开一个 issue 或 pull request 来解决问题。