perl里将一个数组元素唯一化(perl中如何把数组最为hash的key)

本文目录
perl中如何把数组最为hash的key
use strict;
use warnings;
my %hash=(a=》{1=》10,2=》20},b=》{3=》30,4=》40});
foreach my $key1 (keys(%hash))
{
print("\$hash{$key1} has keys:".join(’,’,keys(%{$hash{$key1}})),"\n");
}
Perl 里关于哈希和reference的问题,请教高手
其实想但简单的,教你一个黄金法则:需要什么样的类型,你就把他写成什么样的“形式”, 并且按照适应的方法去处理他就一定不会错了!
举个例子,边解释边完成你的问题:
最好边写程序,边画一个结构示意图:key=》 数组Values, 数组Values的元素是对各个数组的引用,也就是 数组Values-》 数组元素;
1. 简单图示:
Key =》 ;
说明: =》表示哈希,左边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 } } 的值就是$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对应的值, 他是一个数组,所以我们要用的时候只需要把它当成数组写就可以了, 要用整个数组就在两边加上 @{} , 要用某一个元素,就用 ${}...的形式,非常直观,不会出错!所以取值的时候我们用的是:
@ { ${ $locGeneElem{ $loc } } { $gene } } ,整体看来是一个数组。希望你能够把握这种方法,然后再复杂的表达式也能够一眼看懂!
请帮忙看下perl的哈希数组是否需要初始化
perl 的 hash 里没有所谓初始化的概念. 也或者说, 当你 "制造" 了一个 key, 其初始值就是 undef.
我们初始化一个值是为了编程时就算忘了赋某个值时, 还有个基本值可供使用.
但 perl 的 hash 里可以装最单纯的 scalar, 也可以是 array, reference, 甚至是 sub.
这跟 java 或很多其他语言不一样, 要事先宣告 data type. 中间任何时候改变都可以.
所以, 也没有初始化的意义了. 初始化并不能给你甚麼特别的保障.
lrepre 说的很对, 如果是 perl 的新手, 最好都用上 -w 和 use strict. 还有日後你需要用到更复杂的 hash 时, 你还会需要用上
no autovivification; # 这个模块是防止你在 if ( ... ) 中意外地制造了个 key 出来

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30



