Perl 编码规范



当然,每个程序员在格式方面都会有自己的偏好,但有一些通用的指导原则可以使您的程序更易于阅读、理解和维护。

最重要的是始终在 `-w` 标志下运行您的程序。如果您必须这样做,您可以通过 `no warnings` pragma 或 `$^W` 变量显式关闭特定代码部分的警告。您也应该始终在 `use strict` 下运行,或者知道不这样做的原因。`use sigtrap` 甚至 `use diagnostics` pragma 也可能证明有用。

关于代码布局的美学方面,Larry 唯一强烈关注的是多行 BLOCK 的闭合大括号应该与启动该构造的关键字对齐。除此之外,他还有其他不太强烈的偏好:

  • 4 列缩进。
  • 如果可能,将开括号放在与关键字相同的行上,否则对齐。
  • 多行 BLOCK 的开括号前留一个空格。
  • 单行 BLOCK 可以放在一行上,包括大括号。
  • 分号前不留空格。
  • 在“短”单行 BLOCK 中省略分号。
  • 大多数运算符周围留有空格。
  • “复杂”下标(括号内)周围留有空格。
  • 执行不同操作的代码块之间留空行。
  • else 不与 if 紧挨着。
  • 函数名称与其开括号之间不留空格。
  • 每个逗号后留一个空格。
  • 长行在运算符后换行(`and` 和 `or` 除外)。
  • 当前行匹配的最后一个括号后留一个空格。
  • 垂直对齐相应的项目。
  • 省略冗余标点符号,只要清晰度不受影响。

以下是一些其他更重要的样式问题需要考虑:仅仅因为您可以以某种特定方式做某事并不意味着您应该那样做。Perl 旨在为您提供几种执行任何操作的方法,因此请考虑选择最易读的一种。例如:

open(FOO,$foo) || die "Can't open $foo: $!";

优于:

die "Can't open $foo: $!" unless open(FOO,$foo);

因为第二种方法将语句的要点隐藏在修饰符中。另一方面,

print "Starting analysis\n" if $verbose;

优于:

$verbose && print "Starting analysis\n";

因为要点不在于用户是否输入了 `-v`。

当 Perl 提供 `last` 运算符允许您在中间退出时,不要费力地尝试在循环顶部或底部退出循环。只需稍微“缩进”一下以使其更清晰:

LINE:
for (;;) {
   statements;
   last LINE if $foo;
   next LINE if /^#/;
   statements;
}

让我们看看更多重要的几点:

  • 不要害怕使用循环标签——它们既可以增强可读性,也可以允许多级循环中断。参见前面的示例。

  • 避免在空上下文中使用 `grep()`(或 `map()`)或反引号,也就是说,当您只是丢弃它们的返回值时。这些函数都有返回值,因此请使用它们。否则,请改用 `foreach()` 循环或 `system()` 函数。

  • 为了可移植性,在使用可能并非在每台机器上都实现的功能时,请在 `eval` 中测试该构造以查看它是否失败。如果您知道在哪个版本或补丁级别实现了特定功能,您可以测试 `$]`(英文中的 `$PERL_VERSION`)以查看它是否可用。`Config` 模块还允许您查询 Perl 安装时 `Configure` 程序确定的值。

  • 选择助记符标识符。如果您不记得助记符是什么意思,那么您就遇到问题了。

  • 虽然像 `$gotit` 这样的短标识符可能没问题,但请使用下划线来分隔较长标识符中的单词。通常,阅读 `$var_names_like_this` 比 `$VarNamesLikeThis` 更容易,尤其是非英语母语人士。这也是一个与 `VAR_NAMES_LIKE_THIS` 一致且始终有效的简单规则。

  • 包名有时是对此规则的例外。Perl 非正式地为 `integer` 和 `strict` 等“pragma”模块保留小写模块名称。其他模块应该以大写字母开头并使用混合大小写,但可能由于原始文件系统对模块名称表示为必须适合几个稀疏字节的文件的限制而没有下划线。

  • 如果您有一个非常复杂的正则表达式,请使用 `/x` 修饰符并添加一些空格以使其看起来不那么像噪声。当您的正则表达式包含斜杠或反斜杠时,请不要使用斜杠作为分隔符。

  • 始终检查系统调用的返回码。良好的错误消息应发送到 STDERR,包括导致问题的程序、失败的系统调用及其参数,以及(非常重要)应包含导致错误的标准系统错误消息。这是一个简单但足够的例子:

opendir(D, $dir) or die "can't opendir $dir: $!";
  • 考虑可重用性。当您可能想要再次执行类似操作时,为什么要浪费脑力在一个一次性任务上?考虑泛化您的代码。考虑编写模块或对象类。考虑让您的代码在启用 `use strict` 和 `use warnings`(或 `-w`)的情况下干净地运行。考虑赠送您的代码。考虑改变你的整个世界观。考虑……哦,算了吧。

  • 保持一致。

  • 友好相处。

广告