Perl - 编码标准


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

最重要的是始终在 -w 标志下运行您的程序。 如果必须,您可以通过 no warnings pragma 或 $^W 变量为代码的特定部分显式关闭它。 您还应该始终在 use strict 下运行或知道不这样做的原因。 使用 sigtrap 甚至使用诊断编译指示也可能有用。

关于代码布局的美学,Larry 唯一关心的就是多行 BLOCK 的右花括号应该与开始构造的关键字对齐。 除此之外,他还有其他不那么强烈的偏好 −

  • 4 列缩进。
  • 如果可能,与关键字在同一行打开 curl,否则对齐。
  • 多行 BLOCK 的开头花括号前的空格。
  • 一行 BLOCK 可以放在一行上,包括花括号。
  • 分号前没有空格。
  • 在"短"单行 BLOCK 中省略分号。
  • 大多数运算符周围的空间。
  • "complex"下标(括号内)周围的空格。
  • 执行不同操作的块之间的空白线。
  • 不依偎的其他人。
  • 函数名称和它的左括号之间没有空格。
  • 每个逗号后都有空格。
  • 运算符后的长线断线(and and or 除外)。
  • 当前行最后一个括号匹配后的空格。
  • 垂直排列相应的项目。
  • 只要不影响清晰度,就可以省略多余的标点符号。

这里有一些其他更实质性的风格问题需要考虑: 仅仅因为你可以以特定的方式做某事并不意味着你应该那样做。 Perl 旨在为您提供几种做任何事情的方法,因此请考虑选择最易读的一种。 例如 −

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

优于 −

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

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

print "Starting analysis
" if $verbose;

优于 −

$verbose && print "Starting analysis
";

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

当 Perl 提供了最后一个操作符以便您可以在中间退出时,不要通过扭曲来退出顶部或底部的循环。 只是"突出"一点让它更明显 −

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

让我们看看更重要的几点 −

  • 不要害怕使用循环标签——它们可以提高可读性并允许多级循环中断。 请参见前面的示例。

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

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

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

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

  • 包名称有时是此规则的一个例外。 Perl 非正式地为"pragma"模块(如整数和严格)保留小写模块名称。 其他模块应该以大写字母开头并使用大小写混合,但由于原始文件系统将模块名称表示为必须适合几个稀疏字节的文件的限制,可能没有下划线。

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

  • 始终检查系统调用的返回码。 好的错误消息应该发送到 STDERR,包括哪个程序导致了问题,失败的系统调用和参数是什么,并且(非常重要)应该包含标准的系统错误消息,说明出了什么问题。 这是一个简单但足够的例子 −

opendir(D, $dir) or die "can't opendir $dir: $!";
  • 考虑可重用性。 当您可能想再次做类似的事情时,为什么要一次性浪费脑力呢? 考虑概括您的代码。 考虑编写一个模块或对象类。 考虑使用 use strict 和使用警告(或 -w)使您的代码干净地运行。

  • 保持一致。

  • 保持好的标准。