Perl哈希

一、什么是Perl Hash

哈希是一种数据结构。
与数组相似之处:可以容纳任意多的值并能按需取用。
与数组不同之处:不同在于索引方式,数组是以数字来索引,哈希则以名字来索引。
哈希的索引值,此处称为键(key),并不是数字,而是任意唯一的字符串。

另一种思考hash 的方法是,把它看作一堆数据(a barrel of data),每一个数据都有一个相应的标签。可以通过标签访问此标签对应的元素。但其中是没有“第一个”元素的概念的。在数组中,数组元素从0,1,2 开始编号。但在hash中,没有确定的顺序,因此也没有第一个元素。只是一些key-value 对的集合。

keys和values均为任意的标量,但keys通常转换为字符串。因此,如果将表达式50/20 作为keys,则其通常被转换为3字符的字符串“2.5”。
由于Perl的“没有不必要的限制”的设计哲学:hash可以是任意大小,从空hash(没有key/value对),到任何你内存允许的大小。
keys是唯一的,但values可以重复。hash的value可以是数字,字符串,undef,或者它们的混合,但key是唯一的。

二、Perl Hash元素的存取

要访问hash 元素,可以使用下面的语法:$hash{$some_key}
这和访问数组元素的方法有些类似,这里下标(key)上使用的是花括号({}),而不是方括号([ ])。现在key 的表达式是字符串,而非数字。
hash的名字和Perl中其它的标识符的命名规则是一样的(字母,数字,下划线组成,但不能由数字开头)。
访问不存在的hash元素将得到undef。

1、访问整个哈希

要指代整个哈希,可以用百分号(%)作为前缀。如%family_name

2、哈希赋值

可以使用如下的语法在hash 之间拷贝:

%new_hash = %old_hash;

将hash转变成其它形式更加常见。例如,我们可以将hash反转:

%inverse_hash = reverse %any_hash;

3、大箭头符号(=>)

当给hash赋值时,有时并不明显哪些元素是keys,哪些是values,因此发明了大箭头符号(=>)。在需要逗号的时候,都可以使用大箭头符号替换。顺序:键 - 值
如:

my %last_name = (  
    fred => 'flintstone',
    dino => undef,
    barney => 'rubble',
    betty => 'rubble',  
);  

三、Perl Hash函数

某些有用的函数可以对整个hash 进行操作。

1、keys和values函数

keys函数会返回此hash的所有keys,values函数将返回所有的values。如果hash中没有元素,则此函数将返回空列表。

my %hash = ("a"=>1, "b"=>2, "c"=>3);  
print my @k = keys %hash;  
print my @v = values %hash;  

2、each函数

如果想迭代hash的每一个元素,一种通常的方法是使用each函数,它将返回key/value对应的2个元素列表。
当对同一个hash 函数进行一次迭代时,将返回下一个key/value对,直到所有的元素均被访问。如果没有更多的key/value对,则each函数将返回空表。

my %hash = ("a"=>1, "b"=>2, "c"=>3);  
while(($key, $value) = each %hash)  
{  
print "$key => $value\n";  
}  

当然,each返回的key/vlaue对,顺序是混乱的(它其顺序和keys和values函数返回的顺序相同)。如果想将其按序排放,可以对它们排序(使用sort)。

my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);  
foreach $key (sort keys %hash)  
{  
$value =$hash{$key};  
print "$key => $value\n";  
}  

四、Perl Hash的通常用法

1、exists函数

要查看hash中是否存在某个key,可以使用exists函数,如果hash中存在此key,则返回true,与是否有对应的value无关。

my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);  
if(exists $hash{'a'})  
{  
print "true";  
}  

2、delete 函数

delete函数将某个给定的key(包括其对应的value)从hash中删除。如果不存在这个key,则什么也不做,不会有警告或者错误信息。

my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);  
delete $hash{'a'};  
foreach $key (sort keys %hash)  
{  
$value =$hash{$key};  
print "$key => $value\n";  
}  

3、Perl Hash 元素的内插

你可以在双引号的字符串中使用单个hash元素,但不支持整个hash 的内插。

my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);  
foreach $key (sort keys %hash)  
{  
print "$key => $hash{$key}\n";  
}   

猜你喜欢

转载自blog.csdn.net/yejing0609/article/details/51424513