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

[经验分享] 神奇的Perl-哈希与数组(2)

[复制链接]

尚未签到

发表于 2017-5-19 08:17:09 | 显示全部楼层 |阅读模式
声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
1.1         哈希内插哈希

很多情况下,需要几层哈希来存储一个数据表,比如以下学生成绩表:
姓名
物理
化学
数学
张三
85
79
90
李四
77
96
79
王五
86
81
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
总结以上方式形成以下2个程序:
1)     perl3-2.pl:
#perl3-2.pl
#第1层哈希
my %student;
#第2层哈希
%student=(
  "张三"=>{"物理"=>85,"化学"=>79,"数学"=>90},
  "李四"=>{"物理"=>77,"化学"=>96,"数学"=>79},
  "王五"=>{"物理"=>86,"化学"=>81,"数学"=>93},
);
print $student{"李四"}{"化学"};
2)     perl3-3.pl:
#perl3-3.pl
#第1层哈希
my %student;
#第2层哈希
$student{"张三"}={"物理"=>85,"化学"=>79,"数学"=>90};
$student{"李四"}={"物理"=>77,"化学"=>96,"数学"=>79};
$student{"王五"}={"物理"=>86,"化学"=>81,"数学"=>93};
#访问
my $studentreport=$student{"王五"};
print ${$studentreport}{"物理"};

 
 
  其实还有第3种方法,通过PERL的硬引用操作符\完成内嵌哈希的赋值。改写以上代码如下:
#第1层哈希
my %student;
#第2层哈希
   my %cj=("物理"=>85,"化学"=>79,"数学"=>90);
   $student{"张三"}=\%cj;  
   my %cj=("物理"=>77,"化学"=>96,"数学"=>79);
   $student{"李四"}= \%cj; 
   my %cj=("物理"=>86,"化学"=>81,"数学"=>93);
   $student{"王五"}=\%cj;  
#访问

my $studentreport=$student{"王五"};
print ${$studentreport}{"物理"};
 
 
  1.     数组

 
3.1 列表
列表是标量的有序集合,但不能把列表看成一个变量,数组才是变量,数组中存储
列表。
列表的构造方法有以下2种:
1)  (元素1,元素2,元素3)
构造由 3个元素组成的列表。元素类型可以不一致,比如: (‘abc’,123,’xyz’) 
2)  qw(字符串 1   字符串 2   字符串3)
构造由 3个字符串组成的列表,做为列表元素的字符串,不必加上引号,且以
空格隔开。 qw构造的列表, Perl会将其中元素视为加上单引号的字符串, 比如: 
qw(abc   xyz)
qw构造中的()实际为定界符,如果你愿意,也可以写成:
qw/abc xyz/            以“/”为定界符

数组声明与赋值

数组声明格式如下:
my  @数组变量名;
数组赋值格式如下:
@数组变量名=(元素1,元素2,元素3…,元素n);
比如,声明学生姓名数组:
my @student;
@student=(“李明”,”张亮”,”王波”,”李安”);
那么对于二维数组,如何处理呢? 比如,一段曲线坐标点集合,可如下声明赋值:
my  @coordinate;
@coordinate=(
[1.2,3.4],
[1.3,3.2],
[1.6,3.9]
);
数组不要求其元素的数据类型一致,以下赋值方式是合法的:
my @myinfo=(“李四”,“湛江广东”,26,198.22);
对于范围数组的赋值,使用“起点..终点”的格式
比如,赋值元素是从010
my @mynum=(0 .. 10);
my @myalpha=(‘a’ .. ‘z’);
my @myalpha=(‘A’ .. ‘Z’);
 
数组元素访问和修改

语法格式如下:
$数组变量名[下标]
其中下标从0开始计数。
例如:
my @mynum=(0 .. 10);
print $mynum[3];#访问数组元素
$mynum[3]=100;#修改数组元素
print $mynum[3];#输出修改后的数组元素
输出结果如下:
3
100
 

 

运维网声明 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-378903-1-1.html 上篇帖子: Note of Learning Perl--More Control Structures 下篇帖子: perl 附录一 函数集(未定稿)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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