Perl 最佳实践(节选) --- 04
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl 最佳实践(节选) --- 04相关的知识,希望对你有一定的参考价值。
第四章:值和表达式
数据是缺乏生气的……
有点像程序员。
— Arthur Norman
零叁叁.
只对实际会插入的字符串使用插入用字符串界定符。
l 创建字符串直接量而且想插入变量,使用双引号括住的字符串
my $spam_name = “$title$first_name $surname”;
l 创建字符串直接量而且不想插入任何变量,使用单引号括住的字符串
my $spam_name = ‘DrLawrence Mwalle’;
l 如果无插入(uninterpolated)字符串本身包含单引号直接量,就改用q{…}的形式:
my $spam_name =q{r Lawrence (‘Larry’) Mwalle};
l 不要把反斜线(\)作为引号定界符;这样只会让内容和容器难以区分:
my $spam_name = ‘Dr Lawrence (\’Larry\’) Mwalle’;
l 如果无插入字符串包含单引号直接量以及不平衡的大括号,就改用中括号作为定界符:
my $spam_name =q[Dr Lawrence ] Larry{ Mwalle};
零叁肆.
空字符串不要用””或’’。
$error_msg= q{};
零叁伍.
不要用视觉上会产生模糊的方式编写单字符字符串。
零叁陆.
使用具名字字符转义,不要使用数值转义。
通过use charnames指令(pragma)
usecharnames qw( :full);
$escape_seq= “\N{DELETE}\N{ACKNOWLEDGE}\N{CANCEL}Z”;
零叁柒.
使用具名常量,不要使用use constant。
纯粹的数字突然出现在程序中间通常都很神秘、时常令人困惑,而且都是潜在的错误源头。
把这种纯粹的数字直接量换成只读的词法变量,而以变量名词说明该数字的意义:
useReadonly;
Readonlymy $MOLYBDENUM_ATOMIC_NUMBER => 42;
#稍后 ……
print$count * $MOLYBDENUM_ATOMIC_NUMBER;
零叁捌.
不要以前导零替十进制数补位。
如果你必须指定八进制数值,就用内置的oct函数,例如:
useReadonly;
Readonlymy %PERMISSIONS_FOR => (
USER_ONLY => oct(600),
NORMAL_ACCESS => oct(644),
ALL_ACCESS => oct(666)
);
零叁玖.
使用下划线改进长数字的可读性。
use bignum;
$PI =3.141592_653589_793238_462643_383279_502884_197169_399375;
$subnet_mask = 0xFF_FF_FF_80;
零肆零.
在多行上部署多行字符串。
如果字符串内有换行字符,而整个字符串无法在一行内排完,就应该在每个换行字符之后断开,再将那几段串联起来:
$usage= “Usage: $0 <file>[-full]\n”
.“(Use –full option for full dump)\n”
;
零肆壹.
当多行字符串超过两行时,就使用heredoc(Here Document)。
对少数几行而言,“在新行之后断开再串联”的方法很适合,但是对大段的文字而言,就会开始变得没有效率和难看。
对超过两行的多行字符串而言,就改用heredoc:
$usage= <<“END_USAGE;
Usage: : $0 <file> [-full] [-o] [-beans]”
Options:
-full : produce a full dump
-o : dump in octal
-beans : source is Java
END_USAGE
零肆贰.
当heredoc危及你的缩排时,就改用“theredoc”。
较佳的实践是把这类heredoc分离出来,放进预定义常量或子程序内(“theredoc”):
useReadonly;
Readonlymy $USAGE => <<’END_USAGE’;
Usage: qdump <file> [-full] [-o] [-beans]”
Options:
-full : produce a full dump
-o : dump in octal
-beans : source is Java
END_USAGE
#稍后……
if($usage_error) {
warn$USAGE;
}
零肆叁.
每个heredoc中止符号都做成单一大写标识符,而且带有标准的前缀。
print<<’END_LIST’;
getname
setsize
putnext
END_LIST
零肆肆.
引入heredoc时以引号标示终止符号。
注意,在前几条指导方针的heredoc范例中,都在<<之后使用单引号或双引号。
以单引号括起此标示符号,会强迫heredoc不去插入任何变量。
以双引号括起此标示符号,就会确保heredoc字符串会被插入任何变量。
零肆伍.
不要使用未修饰字(bareword)。
strict 指令会在编译期间检查出任何未修饰字:
usestrict ‘subs’;
[email protected] = map {sqrt $_} 0..100;
formy $N (2, 3, 5, 8, 13, 21, 34, 55) {
print$sqrt[N], “\n”;
}
然后抛出异常:
Bareword“N” not allowed while “strict subs” in use at sqrts.pl line 5
零肆陆.
保留=>给成对的东西使用。
每当你创建 键—值、明—值的列表时,都要使用“胖逗号”(即=>, fat comma)来把键与其相应的值联系起来。例如,构建散列时就可用到:
%default_service_record= (
name => ‘<unknown>’,
rank => ‘Recruit’,
serial => undef
);
零肆柒.
不要用逗号排序语句。
有C/C++背景的Perl程序员习惯在Perl程序中写出C风格的for循环:
# 二分查找(binary chop)搜索 ……
SEARCH:
for($min = 0, $max = $#samples, $found_target = 0; $min <= $max; ) {
$pos= int(($max + $min) / 2);
my$test_val = $samples[$pos];
if($target == $test_val) {
$found_target= 1;
lastSEARCH;
}
elsif($target < $test_val) {
$max= $pos - 1;
}
else{
$min= $pos + 1;
}
}
正确的是:
# 二分查找(binary chop)搜索 ……
SEARCH:
for(do{$min = 0, $max = $#samples, $found_target = 0;}; $min <= $max; ) {
# 同前例
}
print‘Sir’,
do{check_name($name); $name;},
‘,KBE’;
零肆捌.
不要把高低优先级的布尔运算混在一起。
为了让条件测试的理解度提升到最大,要完全避免and和not,然后只把低优先级的or保留给易出错的内置函数使用以指定“退路”(fallbackposition):
open my $source, ‘<’, $source_file
or croak “Couldn’t access sourcecode: $OS_ERROR”;
零肆玖.
每个原始列表都要以小括号括起来。
@todo= (‘Patent concept of 1 and 0’, ‘Sue Microsoft and IBM’, ‘Profit!’);
零伍零.
使用表格查找来测试字符串列表中的成员关系;
使用any() 测试任何其他东西的列表的成员关系。
#索引编号是否已被取走?
if(any {$requeste_slot == $_ } @allocated_slots ) {
print“Slot $requested_slot is already taken. Please select another:”;
redoGET_SLOT;
}
如果你的列表成员关系测试使用eq,就不要使用any(),最好改用查找表:
Readonly my %IS_EXIT_WORD
=map { ($_ => 1) } qw(
Qquit bye exit stop done last finish aurevoir
);
稍后 ……
if( $IS_EXIT_WORD{$cmd} ) {
abort_run();
}
以上是关于Perl 最佳实践(节选) --- 04的主要内容,如果未能解决你的问题,请参考以下文章