Perl的资源丰富,某些有用功能已经集成在核心库中了,更多的则在CPAN上。成熟的Perl程序员懂得如何利用好这些资源。
有用的核心模块
Perl语言在设计的过程中一直致力于将实用性和扩展性更好的结合。Perl 5在之前的基础上进行了很大的扩展并且创造了CPAN,但同时它也保留了对之前代码的兼容。(大部分Perl 1的代码能追到1987年 )
现在我们所认为的好代码和1987年时认为的好代码非常不一样了,有部分原因是因为核心库变了。
编译指示strict
该编译指示允许你禁止(或启用)某些语言行为,这些行为虽然功能强大但也可能被滥用,所以需要这么样一个开关来进行控制。
strict模式下禁止符号引用、要求变量声明和禁止使用未声明的裸字。虽然有时候符号引用是必要的,但隐患巨大,如某些情况下,可通过符号变量操纵私有数据。
要求变量声明则有助于检查变量名的拼写错误,同时鼓励使用正确的词法作用域。如果变量都使用my或our来声明,那么就很容易就能看出来你期望的作用域。
strict编译指示的作用域为词法作用域,可通过perldoc strict了解更多细节。
编译指示warnings
该编译指示控制着各种告警行为(启用或禁止)。如对下列行为发出警告:字符串化undef值或对变量使用了错误类型的操作符。
通常,有警告信息产生说明Perl无法理解你的意思而不得不去猜测你的意图,虽然Perl通常会猜测正确,但是消除歧义才能确保你的程序总是会正确运行。
warnings编译指示的作用域为词法作用域,可通过perldoc perllexwarn和perldoc warnings了解更多细节。
如果你同时启用了warnings和diagnostics这2个编译指示,则将还获得每条警告的调试信息,具体请参考perldoc perldiag。这些信息对于学习Perl非常有帮助,但是在部署到实际应用时应该关闭diagnostics,因为大量的调试信息会写爆你的日志文件或导致信息泄露。
编译指示autodie
之前介绍过,如果你在使用open时忘记了检查返回值,如果操作失败那么后续你就是在操作一个关闭着的句柄---更糟的是如果要写句柄则会丢失数据。编译指示autodie就是来解救你的,假设你这样写:
use autodie;
open my $fh, '>', $file;
若open操作失败Perl就会抛出异常。
对于失败的系统调用,最合适的处理方式就是抛出异常,考虑到系统调用的普遍存在,这个编译指示能帮助你少写很多的相似代码哦。
有时候也可能需要仅对部分系统调用启用autodie,那么去看看perldoc autodie吧。
Perl版本号
在代码中指定的Perl的版本号有助于表达你的意图,同时也能方便对代码使用工具。比如你已经在Perl 5.18下测试过你的代码了,并且这段代码只用到了Perl 5.18中的特性,就可以这样写:
use 5.018;
更大的世界
CPAN上也有大量有用的模块。其中Task::Kensho就介绍了不少CPAN上最好用的分发包。当你要解决新问题时,可以先看看里面介绍的那些分发包是否能帮得上你。
这里我们也简单介绍一些:
- 操作数据库,可以使用DBI模块
- 轻量级、单个文件的数据库,可以使用DBD::SQLite模块
- 管理你的数据库纲要(schema),可以使用Sqitch
- 将数据库实体表示为对象,使用DBIx::Class
- 基础的WEB编程,使用Plack
- 需要强大的WEB框架,试试Mojolicious、Dancer或Catalyst
- 处理结构化数据文件,用Text::CSV_XS (或Text::CSV)
- 要管理应用的模块安装,用Carton
- 需要处理数字类数据,用PDL
- 处理图片,用Imager
- 操作共享库,用FFI::Platypus
- 从XML文件提取数据,用XML::Rabbit
- 让代码变得更整洁,用Perl::Tidy
- 需要比strict和warnings更高级的代码分析,用Perl::Critic
CPAN每天都在发展,去看看最近又上传了哪些新东西:http://search.cpan.org/recent 。
用Perl来思考
创新不会停止,学习也将继续。Modern Perl介绍了最优秀的Perl程序员所使用的方法和技术,然而他们的方法和技术会不断发展。2015年伟大的东西,在五年之前可能是无法想象的,但另一方面,即使是2020年(甚至之后)伟大的东西也可能源自于某个Perl骇客现在脑中的一丝念想。
你可以在社区中学习、可以阅读核心模块和CPAN模块的文档、还可以通过实践来发现如何让Perl为你工作及工作得更好。
你有机会去塑造未来!