常见简写和双关语

本文深入探讨了Perl编程语言中使用列表赋值进行变量对调的方法,并介绍了如何利用数组切片灵活置换数组内容。此外,文章还阐述了如何在列表上下文中使用[]或()[],以及大箭头操作符的使用场景。最后,提供了复制列表的方法并强调了避免使用可能引起副作用的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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/archive/2013/02/28/2936141.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值