Perl语言入门(07 Hash)

2016-09-01 19:26:16来源:CSDN作者:haoweilaizoule人点击

由于公司需要,本人最近在学习Perl这种脚本语言,本文是我在学习Perl的过程中总结出来的一些心得和笔记,希望能够帮助也在学习Perl的各位同僚。废话不多说直接上干货!!!

————————————————— 干货分割线 —————————————————

Hash变量以%标注,%a:名字为a的hash结构

数组与哈希的差别是:哈希是按照名字来访问它们的标量的,而不是像数组那样使用数字标号进行访问.

Hash结构包含两个部分,关键字和值.

Hash优点:访问哈希结构中的各个元素是非常快的,并且不会因为哈希结构变大而大幅度降低访问速度。这意味着不管哈希结构拥有1 0个元素还是1 0万个元素,P e r l都能够得心应手并迅速地处理哈希结构。

Hash特性:在哈希结构的内部,关键字的存储顺序是无序的,k e y s函数返回的关键字也没有特定的顺序。

对Hash结构进行初始化:

%food = (‘apple’,’fruit’,’pear’,’fruit’,’carrot’,’vegetable’);该种方法不能很好的表示哪个是键,哪个是值,所以有更好的表示办法,表示为:

%food = ( apple => ‘fruit’,    #此为Hash初始化标准结构

          Pear  => ‘fruit’,

          Carrot  => ‘vegetable’);

 

Hash中取出单个元素:

#!/usr/bin/perl%food = ('apple' => 'fruit','pear' => 'fruit', 'Carrot'=> 'vegetable');print $food {'apple'};

输出:fruit


想要查找Hash中的所有关键字KEY,可以使用keys函数.代码如下:

#!/usr/bin/perl%food = ('apple' => 'fruit','pear' => 'fruit', 'Carrot'=> 'vegetable');foreach $a(keys %food){<span style="white-space:pre">	</span>print "$a/n";}

可能输出结果为:pear Carrot apple (或者Carrot apple pear)

同时输出关键字和值:

#!/usr/bin/perl%food = ('apple' => 'fruit','pear' => 'fruit', 'Carrot'=> 'vegetable');foreach $a(keys %food){<span style="white-space:pre">	</span>print "关键字为:$a --- 值为:$food{$a}./n";}

输出为:

  关键字为:apple --- 值为:fruit.
关键字为:pear --- 值为:fruit.
关键字为:Carrot --- 值为:vegetable.

Perl中提供一个函数values,用于检索哈希结构中存放的所有值

以下代码返回的关键字与值得顺序一致.

#!/usr/bin/perl%food = ('apple' => 'fruit','pear' => 'fruit', 'Carrot'=> 'vegetable');@zl = values %food;@a = keys %food;print "@zl-----@a./n";

可能输出结果为:fruit fruit vegetable-----pear apple Carrot.(或者vegetable fruit fruit-----Carrot pear apple.但是无论顺序怎样变化,关键字和值永远都是对应的)

 

按照值来检索元素:

#!/usr/bin/perl%food = ('cat' => 'animous','pear' => 'fruit', 'Carrot'=> 'vegetable');%zl = reverse %food;   #%zl得到的是值foreach $z(keys %zl){<span style="white-space:pre">	</span>print "$z/n";         #输出值}

原理: 当你对哈希结构使用r e v e r s e函数时,P e r l就将哈希结构转换成一个简单的列表,也许类似于下面这个列表:

('cat','animous','pear','fruit', 'Carrot','vegetable');

然后P e r l对该列表中的元素顺序进行倒序,得到下面这个输出:

('vegetable','Carrot','fruit','pear','animous' ,'cat');

当你将这个列表赋予% zl时,产生的哈希结构将与原始哈希结构相同,只不过现在所有的关键字变成了值,而所有的值则变成了关键字.。不过你应该知道,如果由于某个原因你的哈希结构拥有相重复的值,如果该值(将要变成关键字)不是唯一的,那么你得到的哈希结构拥有的元素将比原先要少。由于在新的哈希结构中,重复的值会发生冲突,因此老的关键字将被新的关键

字代替。

 

将列表赋予数组: @food = %food;  #Hash转化为列表

此时,P e r l会将哈希结构重新变为由关键字和值组成的普通列表。

可能的列表为:cat  animous  pear  fruit  Carrot  vegetable

这时, @ food是个包含6个元素的数组,偶数元素(包含0的元素)是实物的名字(cat,apple...),奇数元素是种类名字(animous,fruit,vegetable).

%food = @food #列表转化为Hash.

Hash的拷贝: %New_Hash = %Old_Hash;

也可以像处理列表那样,将几个哈希结构组合起来并对它进行操作,如:

%both = (%first,%second);  #Hash表合并操作,如果% F i r s t的有些关键字也出现在% S e c o n d中,那么第二次出现的关键字值对就取代% B o t h中的第一个关键字值对.

%Additional = (%both,key1 => ‘value1’,key2 => ‘value2’);  #Hash表合并操作


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台