常见简写和双关语

1.使用列表赋值来进行变量对调

perl会先计算等号右边的表达式,然后对应位置赋值:

$b,$a)= ($a,$b) ;
($c,$a,$b) = ($a,$b,$c) ;
#数组切片让你用简单的语法随意置换数组的内容
@a[1,3,5] = @a[5,3,1] ;

2.用[] 或 () [] 转为列表上下文

my @words = split /\+/, (/([^:]*)/)[0] ;

引用操作符施加在列表上,只会返回一个新的列表,而非数组引用。

my $word_ref = \ (split /\++/,$str) ; #错误
my $word_ref = [split /\++/,$str]  ;  #正确

3. 用=>构造键值对

大箭头操作符=>的功能其实与逗号操作符差不多,唯一的差别是:如果=>左边能识别成一个单词,那么perl会自动将它当成一个字符串,而不是函数调用。

4.用=>指明操作方向

作为“语法糖”来指明操作方向。例如在rename函数中

rename "$file.c" => "$file.c.old";

5. 小心使用{}

my @a = @{func_returning_arrayref} ;   #错误
my @a = @{func_returning_arrayref()} ; #正确
my @a=  @{&func_returning_arrayref};   #正确
my @a=  @{+func_returning_arrayref};  #正确

6 用@{[]}  或 eval{} 的形式来复制列表

Perl里面没有提供复制数据结构的函数,如果需要一份列表的的匿名副本,可以把列表放在匿名列表构造操作符中,然后对它进行解引用。

my @missing_h = grep {  s/\c$/\.h/ and ! -e }  @{[@cfiles]};

另一种产生临时副本的方法是把它放在eval块中,它能返回块内部最后一个表达式的计算结果。

my @missing_h = eval { @cfiles };

提示:尽量使用eval方式,比前一种方式更加高效。

不过遇到这种情况还应该考虑是否真正需要临时副本。 在前面的例子中,完全可以在grep做些改进,引入一个$_变量的临时副本就可以了。

my @missing_h = grep {  my $h= $_; $h =~  s/\c$/\.h/ and !  ( -e $h)  }  @cfiles;

以上方法都是“影子副本”既完整的独立的副本。 如果原始列表中的元素是引用的话,复制的结果和原始数据共享数据。

如果确定需要一份完全独立的深层副本。 请使用Storable 模块的 dclone 函数:

use Stroeabl qw(dclone);

my @copy_ref = dclone(\@array);
原文地址:https://www.cnblogs.com/tjxwg/p/2936141.html