打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
perl学习笔记----从五分钟到三十秒

TIOBE编程社区索引是编程语言普及的一个指标。该指数每月更新一次。 

根据该榜单的数据显示,perl的地位在一步步的下降,相反python的地位稳步上升,确实我周围使用python的小伙伴们越来越多,仍然死磕在perl上的真的不多,不要问我为什么不放弃perl用python。因为我长情,更因为懒,没有精力学第二门语言(暂时),使用perl大概一年半,准确说我是从2017年8月22日开始入手小骆驼,踏出了我漫长的生信学习的第一步。
今天先推一篇文介绍几个perl里的常用概念,更特指一下怎么灵活使用这几个概念实现从五分钟到三十秒

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{}

1our %hash = ('foo',35,'bar',36,'hello',37,'wilma',38);2our %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,完美完成优化

最后,感谢洲更师兄的醍醐灌顶


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Perl 子程序(函数) | 菜鸟教程
Perl引用reference(\运算符)
《源码探秘 CPython》35. 索引冲突与哈希攻击
深入理解数据结构之散列表
如何使用bloomfilter构建大型Java缓存系统 – 码农网
图解HashMap和HashSet的内部工作机制
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服