加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 最佳实践(节选) --- 04

发布时间:2020-12-16 00:26:17 所属栏目:大数据 来源:网络整理
导读:? 第四章:值和表达式 ? 数据是缺乏生气的…… 有点像程序员。 — Arthur Norman ? ? ? ? 零叁叁. 只对实际会插入的字符串使用插入用字符串界定符。 ? l????????创建字符串直接量而且想插入变量,使用双引号括住的字符串 my $spam_name = “$title$first_nam

?

第四章:值和表达式

?

数据是缺乏生气的……

有点像程序员。

— 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”

???????????????????? ;

?

?

?

?

零肆壹.

当多行字符串超过两行时,就使用heredocHere 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();

?????? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读