由于公司需要,本人最近在学习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表合并操作