设为首页 收藏本站
查看: 669|回复: 0

[经验分享] Perl 最佳实践(节选)

[复制链接]

尚未签到

发表于 2015-12-28 08:06:03 | 显示全部楼层 |阅读模式
  
第四章:值和表达式
  
数据是缺乏生气的……

有点像程序员。

— 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
  
  
  
零肆陆.

保留=>给成对的东西使用。

  
  每当你创建 键—&#20540;、明—&#20540;的列表时,都要使用“胖逗号”(即=>, fat comma)来把键与其相应的&#20540;联系起来。例如,构建散列时就可用到:
  
  %default_service_record= (
  name     => ‘<unknown>’,
  rank        =>   ‘Recruit’,
  serial       =>   undef
  );
  
  
  
零肆柒.

不要用逗号排序语句。

  
  有C/C&#43;&#43;背景的Perl程序员习惯在Perl程序中写出C风&#26684;的for循环:
  
  # 二分查找(binary chop)搜索 ……
  SEARCH:
  for($min = 0, $max = $#samples, $found_target = 0; $min <= $max; ) {
  $pos= int(($max &#43; $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 &#43; 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!’);
  
  
  
  
零伍零.

使用表&#26684;查找来测试字符串列表中的成员关系;

使用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();
  }
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157215-1-1.html 上篇帖子: Leaning perl 第2章练习题答案 下篇帖子: Perl中的数组&哈希应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表