Perl 里关于哈希和reference的问题,请教高手
我想做一个Hash存储读入文件的数据,但是要求是一个Key下的reference指向好多个array,每个array下各有不同的elements。我现在是这么写的,但是感...
我想做一个Hash存储读入文件的数据,但是要求是一个Key下的reference指向好多个array,每个array下各有不同的elements。我现在是这么写的,但是感觉不对:
$Hash{$Key} -> [$ArrayNumber] [$ElementNumber] = $Value
这样似乎就是两个array的样子,我以前做过一个key对应一个array的,是这样的:
$Hash{$Key} -> [$ElementNumber] = $Value
但是没做过一个key下有很多array的,不知道直接改这个语句对不对,请教高手应该怎么写! 展开
$Hash{$Key} -> [$ArrayNumber] [$ElementNumber] = $Value
这样似乎就是两个array的样子,我以前做过一个key对应一个array的,是这样的:
$Hash{$Key} -> [$ElementNumber] = $Value
但是没做过一个key下有很多array的,不知道直接改这个语句对不对,请教高手应该怎么写! 展开
4个回答
展开全部
其实想但简单的,教你一个黄金法则:需要什么样的类型,你就把他写成什么样的“形式”, 并且按照适应的方法去处理他就一定不会错了!
举个例子,边解释边完成你的问题:
最好边写程序,边画一个结构示意图:key=> 数组Values, 数组Values的元素是对各个数组的引用,也就是 数组Values-> 数组元素;
1. 简单图示:
Key => [ refArr1 -> [ Elem1, Elem2, ...] , refArr2 -> [...], ... ] ;
说明: =>表示哈希,左边key,右边是对应的值; ->表示引用,右边是实际的结构; 结构用 []括住表示是 数组; 结构用 {} 括住表示是hash;
2. 代码示例:
my %locGeneElem; # 一个起始位点loc 对应多个Gene, 每个Gene 有多个元素,与你需求一致。
my @Elems;
my ($loc, $gene, $elem) = (123456, 'gene1', 'extron');
push @Elems, $elem; #存入最后的数组 @Elems
push @{ $locGeneElem{ $loc } }, $gene; # 但是这样不方便存值,最好是 key 指向hash,存起来方便,不然就加上数组下标:
push @{ $ { $locGeneElem{ $loc } } [0] },@Elems; # 本意跟上一句一样,但需要变量来做下标 0,1 。 $ { $locGeneElem{ $loc } } [0]的值就是$gene的信息,但是丢失了gene1这个信息,需要另存起来!
# 如果 key 指向hash 就方便的多了,如下
push ${ $locGeneElem{ $loc } } { $gene } , @Elems; #存一个引用到
假设现在要遍历输出gene1的信息,那很方便:
for $elem ( @ { ${ $locGeneElem{ $loc } } { $gene } } ){
print $elem, "\n";
}
说明 : 为什么看起来那么复杂??? 有很多 $ 和括号?
这就是好处所在了,从最里面开始看:
1. $locGeneElem{ $loc } 这是一个hash , key 是 $loc, 很好懂, 他的value对应一个hash;
2. ${ $locGeneElem{ $loc } }, 就在1 中的两边加上 ${}就可以了,这样一看就是 hash的结构,也就是 把1的value当成一个hash来看,那么新的key :$gene 放到后面就行了。所以见下3。
3. ${ $locGeneElem{ $loc } }{ $gene }, 这个整体就是 新hash 的key $gene对应的值, 他是一个数组,所以我们要用的时候只需要把它当成数组写就可以了, 要用整个数组就在两边加上 @{} , 要用某一个元素,就用 ${}[0], ${}[1]...的形式,非常直观,不会出错!所以取值的时候我们用的是:
@ { ${ $locGeneElem{ $loc } } { $gene } } ,整体看来是一个数组。希望你能够把握这种方法,然后再复杂的表达式也能够一眼看懂!
举个例子,边解释边完成你的问题:
最好边写程序,边画一个结构示意图:key=> 数组Values, 数组Values的元素是对各个数组的引用,也就是 数组Values-> 数组元素;
1. 简单图示:
Key => [ refArr1 -> [ Elem1, Elem2, ...] , refArr2 -> [...], ... ] ;
说明: =>表示哈希,左边key,右边是对应的值; ->表示引用,右边是实际的结构; 结构用 []括住表示是 数组; 结构用 {} 括住表示是hash;
2. 代码示例:
my %locGeneElem; # 一个起始位点loc 对应多个Gene, 每个Gene 有多个元素,与你需求一致。
my @Elems;
my ($loc, $gene, $elem) = (123456, 'gene1', 'extron');
push @Elems, $elem; #存入最后的数组 @Elems
push @{ $locGeneElem{ $loc } }, $gene; # 但是这样不方便存值,最好是 key 指向hash,存起来方便,不然就加上数组下标:
push @{ $ { $locGeneElem{ $loc } } [0] },@Elems; # 本意跟上一句一样,但需要变量来做下标 0,1 。 $ { $locGeneElem{ $loc } } [0]的值就是$gene的信息,但是丢失了gene1这个信息,需要另存起来!
# 如果 key 指向hash 就方便的多了,如下
push ${ $locGeneElem{ $loc } } { $gene } , @Elems; #存一个引用到
假设现在要遍历输出gene1的信息,那很方便:
for $elem ( @ { ${ $locGeneElem{ $loc } } { $gene } } ){
print $elem, "\n";
}
说明 : 为什么看起来那么复杂??? 有很多 $ 和括号?
这就是好处所在了,从最里面开始看:
1. $locGeneElem{ $loc } 这是一个hash , key 是 $loc, 很好懂, 他的value对应一个hash;
2. ${ $locGeneElem{ $loc } }, 就在1 中的两边加上 ${}就可以了,这样一看就是 hash的结构,也就是 把1的value当成一个hash来看,那么新的key :$gene 放到后面就行了。所以见下3。
3. ${ $locGeneElem{ $loc } }{ $gene }, 这个整体就是 新hash 的key $gene对应的值, 他是一个数组,所以我们要用的时候只需要把它当成数组写就可以了, 要用整个数组就在两边加上 @{} , 要用某一个元素,就用 ${}[0], ${}[1]...的形式,非常直观,不会出错!所以取值的时候我们用的是:
@ { ${ $locGeneElem{ $loc } } { $gene } } ,整体看来是一个数组。希望你能够把握这种方法,然后再复杂的表达式也能够一眼看懂!
展开全部
如果你想要得到一个key下有很多array你这么做
Perl多维数组的语句
定义,赋值多维数组:
%hash1=(
key1=>[['a','b','c'],['d','e','f'],['g','h','i']] ,
key2=>[['j','k','l'],['m','n','o'],['p','q','r']]
);
输出:
print $hash1{key1}[0][0],"\n"; #结果输出 a
print $hash1{key2}[1][1],"\n"; #结果输出 n
定义多维数组:
%hash2=(
key1=>[$ref1,$ref2,$ref3] ,
key2=>[$ref4,$ref5,$ref6]
);
赋值:
$hash2{key1}[0][0]='x';
$hash2{key2}[0][1]='y';
$hash2{key1}[$ref1][2]='z';
输出:
print $hash2{key1}[$ref1][0],"\n"; #结果输出 x
print $hash2{key2}[$ref5][1],"\n"; # 结果输出 y
print $hash2{key1}[0][2],"\n"; #结果输出 z
这能使你清楚写你的代码。
Perl多维数组的语句
定义,赋值多维数组:
%hash1=(
key1=>[['a','b','c'],['d','e','f'],['g','h','i']] ,
key2=>[['j','k','l'],['m','n','o'],['p','q','r']]
);
输出:
print $hash1{key1}[0][0],"\n"; #结果输出 a
print $hash1{key2}[1][1],"\n"; #结果输出 n
定义多维数组:
%hash2=(
key1=>[$ref1,$ref2,$ref3] ,
key2=>[$ref4,$ref5,$ref6]
);
赋值:
$hash2{key1}[0][0]='x';
$hash2{key2}[0][1]='y';
$hash2{key1}[$ref1][2]='z';
输出:
print $hash2{key1}[$ref1][0],"\n"; #结果输出 x
print $hash2{key2}[$ref5][1],"\n"; # 结果输出 y
print $hash2{key1}[0][2],"\n"; #结果输出 z
这能使你清楚写你的代码。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的描述太简单,难以理解,有以下猜测:
这里有两个标量:$value $k
这里有两个hash: %addtolink %thehash
分析如下:
1.hash表addtolink的值是一个数组。
2.$addtolink 取出了hash表 %addtolink 中某一个键$value的值,这个值是数组
3.$#{ $addtolink } 指的是数组的最大下标,该下标比数组元素总和少1
4. 0 .. $#{ $addtolink } 循环从0开始到数组最大下标
5.for $k ( 0 .. $#{ $addtolink } ) 取出数组元素中的某一元素放到变量 $k 中循环知道循环结束。
BTW:
提问是一门艺术。
这里有两个标量:$value $k
这里有两个hash: %addtolink %thehash
分析如下:
1.hash表addtolink的值是一个数组。
2.$addtolink 取出了hash表 %addtolink 中某一个键$value的值,这个值是数组
3.$#{ $addtolink } 指的是数组的最大下标,该下标比数组元素总和少1
4. 0 .. $#{ $addtolink } 循环从0开始到数组最大下标
5.for $k ( 0 .. $#{ $addtolink } ) 取出数组元素中的某一元素放到变量 $k 中循环知道循环结束。
BTW:
提问是一门艺术。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如何你的声卡能正常接上计算机,在进入系统的时候是会弹出发现新硬件的通知的,如果没有就说明更本没有认到你的外接声卡。。。你该去找销售商问一问了。。。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询