IC入职新同学必备技能手册 - Perl - 奇特技巧
Posted 牛排的IC技能树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IC入职新同学必备技能手册 - Perl - 奇特技巧相关的知识,希望对你有一定的参考价值。
写在前面
这是Perl的倒数第二篇文章,搜罗了工作环境中同事的脚本,摘抄了一些我觉得有意思、奇特的代码技巧,用于实现一些非常实用的功能。
数组去重(1):uniq 函数
use List::MoreUtils qw(uniq); # 必须有这个引用
my @arr = ('aa' , 'bb' , 'cc' , 'aa' );
my @unique_arr = uniq @arr;
print "$_ \n" foreach @unique_arr ;
# 还记得$_ 么?
#结果是
aa
bb
cc
数组去重(2):grep 函数
uniq函数最好用,但是需要环境里安装了CPAN支持。下面使用自带grep函数来完成去重。(建议横屏观看)
my @arr = ('aa' , 'bb' , 'cc' , 'aa' );
my %temp_hash;
my @unique_arr = grep { ++$temp_hash{ $_ } < 2; } (@arr);
首先,grep函数的用法是:
grep {筛选条件} (被遍历的数组)
注意,一个是花括号,一个是括号
grep的作用是,将符合“筛选条件”的数组元素“挑”出来,重新组合一个新数组
其次,++$temp_hash{ $_ } 又怎么解读?
$_ 表示循环遍历@arr 数组的每一个元素value, 例子中,一共4个元素,aa, bb, cc, aa
%temp_hash 是声明hash变量,但为啥后面又用$temp_hash?
不必纠结,对于hash变量,绝大部分情况是用 $hash_var{key_name} = key_value 的形式来赋值的
++$temp_hash { $_ } 表示啥呢?(这里我想用文字概括,试了,说不清楚,直接展开循环吧)(建议横屏观看)
是不是在第四次循环时候,不符合grep的“筛选条件” (<2)了?那么,这个多余的aa就没有入选新数组。
至此!完成数组去重
第一次循环:元素=aa, $temp_hash{ 'aa' } = 0,++后,$temp_hash{'aa'} = 1
第二次循环:元素=bb, $temp_hash{ 'bb' } = 0, ++后,$temp_hash{'bb'} = 1
第三次循环:元素=bb, $temp_hash{ 'cc' } = 0, ++后,$temp_hash{'cc'} = 1
第四次循环:元素=aa, $temp_hash{ 'aa' } = 1, ++后,$temp_hash{'bb'} = 2
数组排序:sort函数
网上有好多sort函数的讲解,最好的版本永远是官方文档。。以下为重点部分摘抄:
来源:
https://perldoc.perl.org/functions/sort.html
# 按字符(区分大小写)升序
my @articles = sort {$a cmp $b} @arr;
# 倒序
my @articles = sort {$b cmp $a} @arr;
# 按数字升序
my @articles = sort {$a <=> $b} @arr;
# 倒序
my @articles = sort {$b <=> $a} @arr;
数组的“再处理”:map函数
其实,“再处理”是我的理解 (post-processing),但不是最地道的解释(可以叫映射?)。
举例#1:有一个纯数字的数组,但是你想得到一个新数组,新数组的元素是原数组中每个数的平方。
my @new_arr = map {$_ * $_} (@old_arr) ;
举例#2:有一个数组,里面全是这个班的娃的名字(假设全小写),我想筛选出名字的字母长度是4的,比如john, emma, mike 但jason就不行,那么!(建议横屏观看)
my @new_arr = map { $_ =~ /^\w{4}$/ ? $_ : ()} (@old_arr) ;
# $_ 表示历次循环中娃的名字
# /^\w{4}$/ 是正则表达式,
# ^表示字符串起点锚;
# $表示字符串终点锚;
# \w表示任意字符,\w{4}表示任意4个字符
# xxx ? x : y 三目运算符就不解释啦。
# () 表示忽略这个元素,在新数组中不映射它,说白了,丢掉它。
其实,这个例子可以用grep完成,用map有点累,看如下:(建议横屏观看)
my @new_arr = grep { $_ =~ /^\w{4}$/ } (@old_arr) ;
一行声明多个变量
my ($var1, $var2, $var3, $var4);
my (@arr1, @arr2) ;
暂时看到这些,碰到不错的,我会再加进来。
以上是关于IC入职新同学必备技能手册 - Perl - 奇特技巧的主要内容,如果未能解决你的问题,请参考以下文章