TIOBE编程社区索引是编程语言普及的一个指标。该指数每月更新一次。
根据该榜单的数据显示,perl的地位在一步步的下降,相反python的地位稳步上升,确实我周围使用python的小伙伴们越来越多,仍然死磕在perl上的真的不多,不要问我为什么不放弃perl用python。因为我长情,更因为懒,没有精力学第二门语言(暂时),使用perl大概一年半,准确说我是从2017年8月22日开始入手小骆驼,踏出了我漫长的生信学习的第一步。
今天先推一篇文介绍几个perl里的常用概念,更特指一下怎么灵活使用这几个概念实现从五分钟到三十秒
变量:储存一个或多个值的容器名称,perl里使用的比较多的变量有:标量变量、数组、哈希。变量的名称在整个程序中是保持不变的,但是它所持有的值可以在程序运行过程中改变。 标量变量 : 单单储存一个值得变量,通常用'$'表示
列表:指标量的有序集合
数组:储存列表的变量,精确的说列表指的是数据,而数组指的是变量,通常用'@'表示
哈希:是一种数据结构,和数组之间的区别在于索引方式不同,数组用的数字,哈希是以名字作为索引,简单来说就是你想用什么当索引都行,指代整个哈希可以用'%'表示。
我先列出我在perl里常用的标量变量、数组、哈希的表示方式
标量变量:$a
1、$a = 0;
2、$a == 0;
这里面$a的值都是0,区别在于第一个$a 的值是可变的,第二个是不可变的是固定值后期不可以再对$a进行赋值
数组:@a、$a[]、$a[][]
1、@a = ('a','b','c','d');2、@a = qw(a b c d);3、$a[0] = a;$a[1] = b;$a[2] = c;$a[3] = d;4、$a[0][1] = a;$a[0][1] = b;$a[0][2] = c;$a[0][3] = d;
四种方式表示的数组a 都包含了四个值(a,b,c,d)
1、是典型的字符串列表。
2、用qw简写(quoted word) 可以减少''的输入,更加方便。
3、之前有说过数组是以数字为索引,[]内的数字就是a数组的索引,$+[]可以表示数组内的某一个值。
4、两个[]表示的是一个二维数组,可以理解为一个横坐标一个纵坐标,一维数组也就是普通数组用一个[]表示的,相当于一个横坐标都一致的二维数组。二维数组的功能更为强大。
哈希:%hash,$hash{}
1、our %hash = ('foo',35,'bar',36,'hello',37,'wilma',38);2、our %hash = ('foo' => 35, 'bar' => 36, 'hello' => 37 'wilma' => 38);3、$hash{foo}=35; $hash{bar}=36; $hash{hello}=37; $hash{wilma}=38;
哈希是一个键值对应表“键、值、键、键、值”,键与值之间是依依对应的,每一个键都有一个值与之对应,所以键不能重复,而值可以重复
1、最简单最基础的写法,不过需要键值一一扫描后才知道哪个是键哪个是值,这种写法不是很清晰,不能马上判断出来哪个是键哪个是值,所以有了第二种表示方式
2、用胖箭头来连接键和值,这种方式清晰明了
3、是我在写程序是最常用到的,{}里的相当于键,用键来当索引,$hash{}对应的就是他的值。
背景:前段时间我在写一个程序其中有一步很限速,就是比如一号染色体上1...100bp对应字母A,101...355bp对应字母B,356...798对应字母H,799...1098对应字母C,1098...对应字母B,以此类推。就是说不定长度的序列会对应不同的值。我希望给出一个位置马上就知道对应的字母是什么。 这种情况我的第一反应就是键值对应,用哈希。于是有了一下代码。
foreach $i(1...$chr_length){ # $chr_length染色体长度 if ($i >= $pos_star and $i <=>=>$pos_end){ # $pos_star、$pos_end不定长度的起始和终止位置 $value{$i} = $value # $value该段对应的字母 }}
这段代码就是大致举了个例子,不完整,大家理解一下意思就是,结果是:程序运行结果没有问题,我确实是需要哪个位置就可以输出对应字母,但是运行时间很长啊,我一号染色体450k运行了五分钟,而且我有12条染色体。要知道这只是我整个程序的一小部分,这一步就要那么久实在是太限速了,后来才知道哈希表建成是比较耗时间,何况我需要建立的哈希那么大。所以 我就在这一步卡住了,一直在想怎么完善,但是当时脑子卡住了,一直在哈希这个坑里出不来。
直到后来洲更师兄一语点醒了我,'既然索引是数字,为什么不用数组?'对啊,哈希建表时间长,但是数组快啊,里面把哈希改成数字
foreach $i(1...$chr_length){ if ($i >= $pos_star and $i <=>=>$pos_end){ $value[$i] = $value; }}
回车运行,30s搞定,5min:30s = 10:1,完美完成优化
最后,感谢洲更师兄的醍醐灌顶
联系客服