perl | 关于一行流

2021-08-25  本文已影响0人  布莱特杨

要不要学不学perl呢?
完全可以不学,
也完全可以黑,
但是黑要黑到点子上,
别一天天地将什么“perl将被淘汰“,”将被取代”之类的言论挂在嘴边,
并以之为高论,实则愚蠢至极。
十好几年过去了,也没见谁能取代perl。
“条条大路通罗马!”一直是perl语言奉行的宗旨。
本篇的主要目的是讨论perl中的极简主义。

这里说的极简主义,是极简化的开发,
主要是指如何写最少的代码去做一件事以达到最高的开发效率。
在perl语言的使用中,
有种写法叫“One-line”,
我先前的一些小伙伴经常称之为“一行流”,也有人叫“一刀流”。
“One-line”的效率非常高,
能够让一些看似复杂的工作用一行搞定,
可谓之为居家旅行,装逼撩骚,必备神器。
比如,统计如下文件中每个字符串的频数:

K01962
K01962
K08602
K08602
K08602
K08602
K05521
……
K00133

你可以用这句:

perl -e '%a={};while(<>){chomp;$a{$_}++;};for $k(keys %a){print "$k\t$a{$k}\n"}' ko.list > ko.stat

再比如,计算bed文件区域大小,你可以写这么一行:

$perl -e '$a=0;while(<>){chomp;@_=split /\t/,$_;$a+=abs($_[2]-$_[1])+1;}print $a, "\n";' xgen-inherited-diseases-targets.bed

再再比如,修改当前目录下所有fq文件的名字:

ls *.fastq.gz|perl -ne 'chomp;$_=~s/_L\d_\w+\.R/\.R/;print "$_\n";'

接下来,比较一下,下面三行代码的执行效果是等效的。

#提取文件test.xls中,以#为开头的行
perl -e 'while(<>){print $_ if(/^#/);}' test.xls
perl -ne 'print $_ if(/^#/);' test.xls
grep '#' test.xls

再举一个骚气的例子,统计单词列表中的词频,然后按照词频降序排列输出。

perl -e 'while(<>){chomp;$h{$_}++};for $k(sort {$h{$b}<=>$h{$a}} keys %h){print "$k\t$h{$k}\n"}' environment.list

那么,
学perl除了一行流还有啥呢?
有一句古诗说得好:“无为在歧路,儿女共沾巾!”
不要因为看到岔道而哭哭啼啼,有岔道说明有得选啊!
而且都是殊途同归的,也就是开始的那句“条条大路通罗马”。

布莱特杨
2021.8.25 10:59

上一篇 下一篇

猜你喜欢

热点阅读