在命令行中快速调试您的Perl代码
我记得我第一次开始用Perl编程时,每当遇到某些事情没有按预期工作,我会写一个快速脚本来隔离问题并测试它。我没有给脚本取好名字;它们是废弃的,很快我的硬盘上就布满了数百个无用的Perl脚本。
我很少再写这样的脚本了。如果我正在开发一个模块,我会写一个单元测试来彻底解决我正在研究的问题 - 这样我是在进行投资而不是扔掉代码。然而,大多数时候,我只是写一个单行命令,这是直接在终端中输入的单行Perl代码。单行命令打字速度快,它们会保留在您的终端历史记录中以便快速迭代。所以如果您发现自己需要测试某个特定的函数是否按您所想的那样工作,或者不确定您精心设计的正则表达式是否正确,请写一个单行命令。
单行命令基础
Perl有大量的命令行开关(请参阅perldoc perlrun
),但我只会介绍您通常需要用于调试代码的开关。最重要的开关是-e
,用于执行(或可能“参与”)。-e
开关接受一个引用的Perl代码字符串并执行它。例如
$ perl -e 'print "Hello, World!\n"'
Hello, World!
您必须使用单引号来引用-e
的代码。这通常意味着您不能在单行命令代码中使用单引号。如果您使用Windows cmd.exe或PowerShell,则必须使用双引号。
我总是忘记Perl的预定义特殊变量做了什么,并且经常使用单行命令在命令行中测试它们,以查看它们包含的内容。例如,您还记得$^O
是什么吗?
$ perl -e 'print "$^O\n"'
linux
它是操作系统名称。弄清楚这一点后,让我们看看我们还能做什么。如果您使用的是相对较新的Perl(5.10.0或更高版本),您可以使用-E
开关而不是-e
。这将打开Perl的一些新功能,如say
,它将字符串打印出来并在其后附加一个换行符。这可以节省打字并使代码更整洁。
$ perl -E 'say "$^O"'
linux
非常方便!say
是一个您将反复使用的巧妙功能。
版本是V
如果您需要检查系统上安装的Perl版本,请使用-v
开关。
$ perl -v
This is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2015, Larry Wall
...
快速提示:如果您需要有关已安装Perl版本的详细信息,请使用大写字母:-V
。
使用M加载模块
模块也可以在命令行中加载。例如,为了下载并打印PerlTricks.com的首页,我可以使用HTTP::Tiny。
$ perl -MHTTP::Tiny -E 'say HTTP::Tiny->new->get("http://perltricks.com")->{content}';
<!DOCTYPE html>
<html lang="en">
<head>
<title>PerlTricks.com - Perl programming news, code and culture</title>
<meta charset="utf-8">
,,,
如果您需要从模块中导入函数,请使用一个等号,后跟一个以逗号分隔的函数名称列表。我可以通过加载XML文件来检查XML文件是否为有效的XML,并使用XML::Simple及其XMLin
函数。
$ perl -MXML::Simple=XMLin -e 'XMLin("data.xml")'
如果XMLin
没有发出任何警告或异常,则数据可能格式正确。
使用w打开警告
这一点很简单:使用-w
来打开警告。这可以在代码未按预期行为时非常有用。警告可以帮助您识别其他方面难以发现的问题。
$ perl -E '$counter = 2; $countor = 3; say $counter'
2
嗯,$counter
应该是3,不是吗?打开警告可以快速识别问题。
$ perl -wE '$counter = 2; $countor = 3; say $counter'
Name "main::countor" used only once: possible typo at -e line 1.
2
还有很多更微妙的错误,警告不会直接识别,但Perl发出警告会使您意识到有问题。以下是一个例子
$ perl -MTry::Tiny -wE '$pass; try { $pass = "true" } catch { say $_ } return $pass if $pass or die'
Useless use of a variable in void context at -e line 1.
Died at -e line 1.
您能看出这里有什么问题吗?catch
块缺少一个尾随的分号。打开警告后,您可以知道有问题,但不是很明显。
使用I包含目录
有时你可能会遇到一些不在Perl标准位置的模块。这通常发生在你正在调试一个应用程序,但它是通过CPAN安装的。为了演示这一点,我将下载我的WWW::curlmyip模块
$ cpan -g WWW::curlmyip
$~ tar xzf WWW-curlmyip-0.02.tar.gz
$ cd WWW-curlmyip-0.02/
WWW::curlmyip导出一个名为get_ip
的函数,该函数返回你的外部IP地址。我可以在一行代码中使用它
$ perl -MWWW::curlmyip -E 'say get_ip'
Can't locate WWW/curlmyip.pm in @INC (you may need to install the WWW::curlmyip module) (@INC contains: /home/dfarrell/.plenv/versions/5.20.2/lib/perl5/site_perl/5.20.2/x86_64-linux /home/dfarrell/.plenv/versions/5.20.2/lib/perl5/site_perl/5.20.2 /home/dfarrell/.plenv/versions/5.20.2/lib/perl5/5.20.2/x86_64-linux /home/dfarrell/.plenv/versions/5.20.2/lib/perl5/5.20.2 .).
BEGIN failed--compilation aborted.
这没有工作。Perl抱怨找不到WWW::curlmyip。为了解决这个问题,我可以使用-I
包括包含模块的分布lib
目录
$ perl -Ilib -MWWW::curlmyip -E 'say get_ip'
100.241.20.7
现在get_ip
函数可以正常工作了。
总结
如果你需要检查一行代码的语法,只需运行perl -h
以获取可用选项的摘要。另一个很好的资源是官方文档,你可以在终端中使用perldoc perlrun
来阅读。
本文介绍了用于调试代码的最常见命令行开关,但可以写一本书来介绍Perl一行代码。事实上,已经有一本:Peteris Krummins的《Perl One-Liners》(No Starch Press)。在这本书中,Peteris用示例程序描述了各种命令行开关。它还包括了在Windows上运行一行代码的优秀的“如何做”指南。
最后,Perl 6也有出色的单行代码支持,开关与Perl 5大致相同。如果你感兴趣,请查看我们的文章Get started with Perl 6 one-liners。
本文最初发布在PerlTricks.com上。
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开问题或拉取请求来帮助我们。