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 { $_ } 表示啥呢?(这里我想用文字概括,试了,说不清楚,直接展开循环吧)(建议横屏观看)


    第一次循环:元素=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


    • 是不是在第四次循环时候,不符合grep的“筛选条件” (<2)了?那么,这个多余的aa就没有入选新数组。


    • 至此!完成数组去重


数组排序: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 - 奇特技巧的主要内容,如果未能解决你的问题,请参考以下文章

真的醉了!GitHub标星1w的安卓架构师必备技能,成功入职阿里

新手程序员入职新公司,该如何快速上手?

入职新公司

谈谈入职新公司1月的体会

入职新公司如何熟悉项目

入职新公司后应该要做哪些事