1、Perl哈希简介
-
什么是哈希
英文名hash,也被称作散列
是一种数据类型
-
哈希有两部分组成:
键(key)
值(value)
键和值可以是任何的标量
键的取值必须唯一,值可以重复
哈希是无顺序的
以%开头,如%car, %class
-
对于一维数组%class, $class{"小李"}是一个值
多维哈希,$calss{"小李"}{"English"}
-
对于多维哈希,前面几级也可以看作成hash,%{$class{“小李}}
哈希的键和值
-
哈希和数组的关系
Hash结构有时候也被称作关联数组
同名的标量,数组和hash之间没有任何关系:$student, @student, %student
-
区别在于:
表示方法不同,一个是@,一个是%
索引量的相对性和绝对性
数组是一种相对引用
-
哈希是一种绝对引用
2、Perl哈希的操作
-
创建哈希
创建空哈希:%hash_A = ();
-
给hash赋值
列表直接给hash赋值
%hash_A = ("key1","value2","key2","value2"...);
Perl中用胖箭头=>解决键值不易区分的问题:%hash_A = ("key1" => value1, "key2" => value2);
使用胖箭头时,等号左边的值会自动被引号引用起来:%hash_A = (key1 => value1, key2 => value2);
指定键进行赋值,每次赋值一个:$hash{"kay"}=value;
-
hash之间赋值
- 使用等式赋值:%hash_A = %hash_B;
-
多维hash的赋值
- 直接在赋值的时候使用括号标识层级
-
在hash中修改、添加元素
给与之对应的键设置一个新的数值
如果这个键不存在,他将会被创建
形式为$hash_name{"key"}=value
-
删除hash值
- 使用delete进行删除:delete($hash_name{key})
-
hash的切片
hash的切片指的是把想要的元素提取到一个新的数组
@hash_name{"key1","key2"...} #一定要用{}
-
hash的合并
将两个或多个hash合并成一个hash
%new_hash = (%hash_1,%hash2) #一定要用()
如果键一样,后面的覆盖前面的
3、Perl哈希函数
-
exist函数
判断hash中是否存在对应的键值
exist $hash{key}
返回值为0,hash元素值不存在
返回值为1,hash元素值存在
-
each函数
返回2个元素的列表
分别是键和它对应的值
($key, $value) = each(%hash)
-
ENV函数
%ENV特指当前环境变量哈希
键是变量名,值是变量值
-
reverse函数
该函数将哈希的键和值进行倒转
%hash_B = reverse %hash_A
-
keys函数
返回hash所有键的列表
@array = keys %hash
只返回下一级
顺序是随机的
-
values函数
返回hash值的列表
@array = values %hash
只返回下一级
顺序是随机的
4、Perl哈希的使用
-
获取hash的长度
hash中键的个数
对于数组,$length = @array返回数组中元素的个数
对于hash,$length = %hash返回复合值
$length = keys %hash获得hash的长度
-
hash的排序
hash的存储是无序,随机的
-
使用sort进行排序
$a cmp $b: 从小到大,字母,ASCII值
$a <=> $b: 从小到大,数字
-
hash的引用
hash引用的hash的地址
对引用进行操作会改变原hash的值
-
引用的创建:
使用\符号:$herf = \%hash; $aref = $href;
用{}表示匿名哈希的引用:$href = {"key1"=> abc, "key2"=> def}
-
hash的解引用
-
使用{}进行解引用,相当于一个hash名
%hash = {"fruit1"=>"apple","fruit2"=>"pear","fruit3"=>"banana"}
$href = \%hash
%{href}等价于%hash
${$href}{"fruit1"}等价于$hash{"fruit1"},值为“apple”
-
用“->"解引用
${$href}{"fruit1"}等价于$hash{"fruit1"}, 值为"apple"
可写为:$href->{"fruit1"}
同$href{"fruit1"}没有任何关系
-
参考来源:https://www.jikexueyuan.com/course/1728.html