Skip to content

Perl 编码标准

虽然 Perl 提供了极大的灵活性,但遵循编码标准和最佳实践对于编写可读、可维护且健壮的程序至关重要。尽管存在个人偏好,但以下指南在 Perl 社区中被广泛接受。

黄金法则:use strict 和 use warnings

Section titled “黄金法则:use strict 和 use warnings”

总是以以下内容开始你的 Perl 脚本和模块:

use strict;
use warnings;

use strict; 启用了更严格的 Perl 解释,可以在编译时捕获许多常见的拼写错误和逻辑错误。use warnings; 为可疑的结构提供诊断消息。这两个编译指示 (pragmas) 是现代、安全 Perl 编程的基础。较旧的命令行标志 -w 通常已被 use warnings; 取代。

一致的格式可以显著提高可读性。考虑使用代码格式化工具如 Perl::Tidy 来自动化此过程。一般指南(受 Larry Wall 的偏好和常见实践启发):

  • 缩进: 使用 4 个空格进行缩进。避免使用制表符 (tab),或者配置你的编辑器将制表符转换为空格。
  • 大括号: 将多行代码块的起始花括号放在与关键字同一行(K&R 风格)。闭合花括号应与启动该结构的关键字对齐。
  • if ($condition) { # ... code ... }
  • 空格: 在操作符(=、+、&& 等)周围使用空格以提高清晰度。在逗号后使用空格。例如:my $x = $y + $z;
  • 单行代码: 简短的单语句块可以放在一行,但要确保清晰:if ($debug) { say "Debugging"; }
  • 分号: 始终使用分号结束简单语句,即使在某些单行块中是可选的。保持一致性有助于理解。
  • 行长: 目标是每行不超过 80-100 个字符。在操作符后断开长行(and、or、&&、|| 除外,这些通常放在新行的开头更易于查看)。
  • 垂直对齐: 如果能提高可读性,请垂直对齐列表、哈希定义或复杂条件中的对应项。
  • 空行: 使用空行分隔逻辑代码块。
  • 括号: 虽然对于某些内建函数(如 print "foo")来说是可选的,但对于用户定义的子程序(my_sub())和用于澄清复杂表达式的优先级时,请使用括号。
  • 文件操作: 使用三参数形式的 open 并配合词法文件句柄 (my $fh)。始终检查 open 的返回值,并使用 $! 提供有描述性的错误消息。
  • open my $fh, '<', $filename or die "Cannot open '$filename' for reading: $!";
  • 错误处理: 对于简单情况,or die 就足够了。对于更复杂的错误处理,考虑使用 eval { ... }; if ($@) { ... } 或模块如 Try::Tiny。
  • 循环控制: 使用 last 退出循环,使用 next 跳到下一次迭代。循环标签 (MY_LOOP: for (...)) 可以用于澄清嵌套循环的控制,但请审慎使用。
  • 空上下文: 避免在空上下文(返回值被丢弃)中使用 grep、map 或反引号 (`command`) 等函数。如果你不需要返回值,请使用 foreach 循环或 system()。
  • 可移植性: 如果使用可能并非在所有地方都可用的特性,请测试它们的存在性(例如,使用 eval 或检查 $] 以获取 Perl 版本)。Config 模块可以提供关于 Perl 安装的信息。
  • 标识符: 为变量和子程序选择有意义的(助记性的)名称。使用下划线分隔较长的标识符中的单词($user_input、calculate_total_amount)。包/模块名称通常使用 TitleCase(例如,My::Module)。
  • 正则表达式: 对于复杂的正则表达式 (regex),使用 /x 修饰符以允许空白和注释,提高可读性。如果模式中包含斜杠,请使用替代分隔符(例如,m{pattern}x、s(pattern)(replacement))。
  • if ($text =~ m{ ^ start \s+ # Match 'start' at the beginning, followed by whitespace ( \w+ ) # Capture a word $ # End of string }x) { my $word = $1; ... }
  • 模块化和 CPAN: 通过创建子程序和模块来编写可重用的代码。在编写新代码之前,请在 Comprehensive Perl Archive Network (CPAN) (metacpan.org) 上搜索可能解决你现有问题的模块。学习使用 CPAN 模块是 Perl 的一项关键技能。
  • 测试: 为你的代码编写测试。Test::More 是用于编写测试脚本的标准模块。自动化测试对于健壮的软件至关重要。
  • 可读性优先于简洁性: 尽管 Perl 允许编写非常简洁的表达式,但请优先考虑清晰度。编写易于他人(以及你未来的自己)理解的代码。
  • 一致性: 无论你做出何种风格选择,都要在整个项目中保持一致。

考虑可重用性。既然你可能想再次做类似的事情,何必浪费脑力去做一次性的事情呢?考虑通用化你的代码。考虑编写一个模块或对象类。考虑让你的代码在使用 use strict 和 use warnings 生效时干净地运行。考虑贡献你的代码。考虑改变你的整个世界观。考虑…哦,算了。

保持一致。

保持友善。

有关更深入的风格指南,请查阅 perlstyle 文档(perldoc perlstyle)。许多组织也有自己的 Perl 编码标准。