第一章 最佳实践
三个目标
强健
存储引用的变量的名称都加上 _ref
效率
可维护性
将理解写入说明文档或源代码.
改变习惯
第二章 代码部署
括号方式
用 K&R
风格, 即 {
放在一行的末尾:
关键字
关键字和后续的括号间加一个空格:
1 2 3
| while ($min < $max) { ... }
|
子程序和变量
子程序和变量在其名称和后续括号间不能有括号:
1 2
| my @candidates = get_candidates($marker); print $array[0];
|
内置函数
Perl 有很多内置函数实质上就是该语言的关键字, 所以不需小括号便可以合法调用它们:
键和索引
把复杂的键或索引与周围的括号分开.
如:
1 2 3
| $candidates[$i] = $incumbent{ $candidates[$i] { get_region() } };
print $incumbent{ $largest_gerrymandered_constituency };
|
运算符
利用空白让二元运算符相对于其操作数更醒目:
如把 +
和 *
这些:
1 2 3 4 5
| my $displacement = $initial_velocity * $time + 0.5 *acceleration * time**2;
my $price = $coupon_paid * $exp_rate + ($face_val + $coupon_paid) * $exp_rate**2;
|
可以根据优先级来选择空白的数量. 如这里的 $exp_rate**2
就写得紧凑, 显示高优先级.
一元运算符应该和其操作数紧贴在一起, 如 -
, !
:
1
| my $spring_force = !$hyperextended ? -$spring_contant * $extension : 0;
|
分号
本来, 一个代码块的最后一条语句后面并不需要分号, 但最好都放上分号.
逗号
多行列表中的每个值后面都放逗号.
如:
1 2 3 4 5 6 7 8 9
| my @dwarves = { 'Bashful', 'Doc', 'Dopey', 'Grumpy', 'Happy', 'Sleepy', 'Sneezy', }
|
有尾端逗号.
代码行的长度
使用 78 列的代码行.
好处为, 确保通过电子邮件传送的代码片段在至少被引用一次时还不会产生重叠.
缩排
使用 4 列缩排层次.
较小的缩排会把固定宽度显示器上能显示的嵌套缩排层次数目最大化.
如:
1 2 3 4 5 6 7
| while (my $lines = <>) { chomp $line; if ( $line =~ s{\A (\s*) -- (.*h)}{$1#$2}xms) { push @comments, $2; } print $line; }
|
制表符
以空格缩排, 不要以制表符 (tab) 缩排.
在不同输出设备上打印或者贴到文字处理器的文档时, 甚至只是在别人设有不同制表符空间的编辑器上观看时, 制表符看起来都不会相同.
将按下 Tab
键的结果转换为空格, 而不是制表符, 对于 vim
:
1 2 3 4
| set tabstop=4 set expandtab set shiftwidth=4 set shiftround
|
块
绝不把两条语句放在同一行.
如:
1 2 3 4
| while (my $record = <$inventory_file>) { chomp $record; next RECORD if $record eq $EMPTY_STR ... }
|
写为:
1 2 3 4 5
| while (my $record = <$inventory_file>) { chomp $record; next RECORD if $record eq $EMPTY_STR ... }
|
写 map
为:
1 2 3 4 5 6
| my @clean_words = map { my $word = $_; $word =~ s/$EXPLETIVE/[DELETED]/gxms; $word; } @raw_words;
|
组块
代码要分段落.
将每块程序分成一些能完成单一任务的序列, 再在每个序列间放置一行空白. 可以在每个段落开始处放置一行注释.
如:
1 2 3 4 5 6 7 8 9 10 11 12
| sub Test { code
code
code
... }
|
Else
不要紧贴着 else
.
写成:
垂直对齐
垂直对齐相对应的项目.
如数组, 散列赋值:
1 2 3 4
| my @months = qw ( January February March April May June );
|
对齐赋值运算符.
断开长行
在运算符之前断开长表达式, 且遵循靠左规律, 如:
1 2 3 4 5
| push @steps, $steps[-1] + $radial_velocity * $elapsed_time + $orbital_velocity * ($phase + $phase_shift) - $DRAG_COEFF * $altitude ;
|
非末端表达式
把语句中的冗长表达式分离出来, 即可以用一个变量之类的来替换冗长表达式, 如:
1 2 3 4 5 6
| my $next_step = $steps[-1] + $radial_velocity * $elapsed_time + $orbital_velocity * ($phase + $phase_shift) - $DRAG_COEFF * $altitude ; add_step( \@steps, $next_step, $elapsed_time);
|