perl入门04:哈希数据结构

要点一:认识哈希

1、概念

与数组类似,哈希储存多个标量。区别如下:

  • 数组用@符号表示,访问数组时通过下标数字访问;
  • 哈希用%符号表示。哈希通过名字(字符串)访问,联想电话簿 姓名--号码间的关系。专业术语称之为键值对。电话簿的姓名为“键”,对应的号码为键的值。

生物信息中尤其常用,比如将fasta序列的ID名与序列对应起来。注意哈希的键要保证唯一性。

2、构建哈希

  • 定义一个空的哈希,也是清空哈希的一种方法
%phonenumber=();  #定义一个空的哈希,也是清空哈希的一种方法
  • 法1
$phonenumber{("wang")}=123456789;
  • 法2
%phonenumber=("li",12345,"zhao",789123,"chen",147852);   #法2
  • 法3
%phonenumber= (
        "li"=>123456,
        "zhao"=>789123,
        "chen"=>147852,
        );

  • 实际构建哈希的小例子
    如下图有一个文本文件,每行为省份与对应的省会,用空格分隔。这里我们将用省份作为键、省会作为值构建哈希。


    省份与省会
#!/usr/bin/perl  -w
use Data::Dumper;   #加载模块,最后查看哈希数据结构用
%hash=();  #定义一个空的哈希


open IN,"<$ARGV[0]";
while (<IN>) {
    chomp;
    @line=split /\s+/,$_;  
#以空格符分隔每行数据,储存到数组中; +为1到多个,避免有未观察到的多个空格符;
# 在本例中是将每行分隔为省份,省会两个元素储存到@line数组里。
    $hash{$line[0]}=$line[1];  #变量符为$
}
close IN;

print Dumper (\%hash);    #打印哈希,观察是否构建成功
%hash

3、哈希操作函数

  • 取键或者值列表
@key=keys %hash;   #返回哈希键列表,常用于遍历哈希
@value=values %hash;   #返回哈希值列表
print "@key\n@value\n";  #无序性
@temp=sort keys %harsh
foreach (@temp)
    print "$_\n";
    print "$hash{$_}\n"
}
  • 检测存在与否:存在为真,不存在为假
if (exists $hash{Jilin}) {    
    print "hash{Jilin}\n"
}
  • 删除键值对
delete $hash{Jilin};

要点二:哈希实战小例子

目的:现有一个基因名文件,想从某一个序列数据库中提取所有基因名文件所包含的序列。

#!/usr/bin/perl -w
use strict;
#添加帮助信息
if (scalar @ARGV==0) {      #如果输入参数个数为0
    die "Usage: This program is used to get seqence by a list
        perl $0 <name list> <fasta sequence>\n";  #$0表示脚本文件名
}

my %hash=();
open IN,"$ARGV[0]";
while (<IN>) {
    chomp;
    my @line=split /\s+/,$_;
    $hash{$line[0]}=1;   
#注意这里我们只利用哈希的键(基因名),值这里就随便取为1
}
close IN;
# 读入fasta文件,若基因名文件与序列ID相同,则读取;否则跳过
open FA,"<$ARGV[1]";
$/=">";<FA>;   #用大于号做分隔符,分割成两段,大于号之前的空/大于号,赋值给一个空变量。
while (<FA>) {
    chomp;
    my $temp=(split /\n/,$_,2)[0];  #根据换行符将$_字符串分成ID与序列两个部分,数字2设置分隔的标量数
    my $id=(split /\s+/,$_)[0];
    if (exists $hash{$id}) {     #判断ID是否存在于哈希中
        print ">$_";
    } else {
        next;
    }
}
close FA;
perl 1.pl A.list A.faa 
perl 1.pl A.list A.faa | le
perl 1.pl A.list A.faa >A.unique
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容