Perl-hash
哈希2.1 什么是哈希
哈希是一种数据结构,以数字、字符串等为索引将值存放到其中,或者从中取回值。哈希把任意长度的输入(键),通过散列算法,变换成固定长度的散列值输出,将输入视为索引,将输出视为给索引分配的唯一内存地址,地址里存放的是这个索引代表的内容。
2.2.1 访问语法
2.2.1.1 读取哈希(hash) 元素
语法如下:
$hash变量名{哈希健}
如:
$studentage=$age{张三};
2.2.1.2 修改或增加哈希(hash)元素
语法如下:
$hash变量名{哈希健}=健值。
如:
$age{张三}=28;
2.2.1.3 访问不存在的hash健值
不存在的hash健值的访问结果是undef,undef即未定义。
2.2.2 哈希变量声明
对于使用了use strict语句的程序,必须事先声明变量,语法如下:
变量范围 %哈希变量名
如:
my%studentage;
2.2.3 哈希拷贝与反转
哈希之间的拷贝语法如下:
%新变量名 = %被拷贝的变量名;
如:
%newstudentage=%studentage;
哈希反转语法如下:
%newstudentage=reverse %studentage;
哈希的反转指哈希键和哈希值调换,例如:
my %student;
my %newstudent;
%student=("张三"=>"上海","李四"=>"广州","王五"=>"北京");
print"$student{'张三'}\n";
%newstudent=reverse%student;
print"$newstudent{'上海'}\n";
输出如下:
上海
张三
上述代码中,未反转之前,张三为键,上海为值,反转后,上海为键,张三为值。
2.2.4哈希赋值
使用大箭头符号(=>)对HASH赋值,箭头左边是健,右边是值。
语法如下:
my%变量名=(
健名1=>健值1,
健名2=>健值2,
………..
……….
健名n=>健值n
)
如:
#perl3-1.pl
use strict;
use warnings;
#哈希赋值
my %studentage;
%studentage=(
"张三"=>19,
"李四"=>22
);
#访问哈希
print "张三:$studentage{'张三'}";
print "\n";
3.内插哈希
很多情况下,需要几层哈希来存储一个数据表,比如以下学生成绩表:
姓名 物理化学数学张三 85 7990李四 77 9679王五 86 9193
这个成绩表需要2层哈希,所谓哈希内插哈希。第1层哈希存储行,即学生姓名。第2层哈希,存储每行的信息,即学生的每门成绩。2层哈希如何结合起来存储学生成绩表,并提供相关访问呢?
首先,我们来解决存储问题。
#第1层哈希
my %student;
#第2层哈希
%student=(
“张三”=>{“物理”=>85,“化学”=>79,“数学”=>90},
“李四”=>{“物理”=>77,“化学”=>96,“数学”=>79},
“王五”=>{“物理”=>86,“化学”=>81,“数学”=>93},
);
在上述代码中,%student由3个键组成:张三、李四、王五,与这些键相关的值则位于花括号中,并含有嵌套的哈希(即:键值对)。张三键的相应值中含有3个嵌套的键:物理、化学、数学,其值分别是85、79、90。
李四键的相应值中含有3个嵌套的键:物理、化学、数学,其值分别是77、96、79,王五也同理。
上述代码还可写成:
#第1层哈希
my %student;
#第2层哈希
$student{“张三”}={“物理”=>85,“化学”=>79,“数学”=>90};
$student{“李四”}={“物理”=>77,“化学”=>96,“数学”=>79};
$student{“王五”}={“物理”=>86,“化学”=>81,“数学”=>93};
其次,访问这2层哈希,比如访问王五同学的数学成绩:
第一种方式:
print $student{“王五”}{“数学”};
第二种方式:
my $studentreport=$student{“王五”};#取得第一层HASH
print ${$studentreport }{“数学”};#访问第二层HASH
页:
[1]