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’; ? ?????? my@sqrt = 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,$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(); ?????? } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |