设为首页 收藏本站
查看: 933|回复: 0

[经验分享] Perl-hash

[复制链接]

尚未签到

发表于 2017-5-16 12:49:54 | 显示全部楼层 |阅读模式
哈希
         

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 79  90
李四 77 96  79
王五 86 91  93


这个成绩表需要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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378198-1-1.html 上篇帖子: perl shift 下篇帖子: 安装Perl及Perl模块Net::SSH2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表