数组的优缺点:
元素内容可由下标直接得到。基址 + 下标 * 元素大小,是访问最快的方法。
缺点:
元素内容与位置无关。
HASH数组的特点:
1.有的位置可能无值为空,但也要留出空间。浪费空间,换取时间
2.数组内容没有顺序的
3.对查找单个值,比数组通过索引立即找到值慢,多了函数计算。但比链表块,不用从头到尾查一遍。
HASH 数组的形式: %h=('a',1,'b',2);
以%开头,与$h是不同的变量。()为空散列。
关联数组的下标称为关键字key, 由key得到的为值value
%h=('a'=>1,'b'=>2);键和值间的逗号可为=>,相当于逗号。
%h=(a=>1,b=>2);键的引号可省略,用=>时自动认为是字符窜。
元素形式: $hash{'a'}
元素为简单变量,用$。 key为简单变量类型
$h{2.5}, ${-1},$h{$k}
关联数组的赋值
标准: %a=("key1",1,"key2",2);
数组和散列间赋值:%h=@a,散列也是数组。
@a=%h,数组元素的顺序随机。
%h1=%h2
($a,%h)=@array;
%h=(%first,%second),浪费内存
%h1=(%h2,'k','v'),增加一组键值。必须成对出现。
函数的返回:%h=split();
片断:@keys=('a','b','c');
@hash{@keys}=@hash{reverse(@keys)}
@不能改为$,因为$hash{}中key要求是简单变量,@keys=3,成了$hash{3}
元素赋值与操作:
增加: 赋值$h{'a'}=1,不存在则创建,hash不存在也创建。
删除: delete $h{$k}
不要用push,pop,shift,splice等与顺序有关的函数,否则结果不可知。
显示:不能print '%hash";原样打印
print %hash 显示无空格。
用遍历的方法来逐一显示。
当$a=%h时,显示的不是长度,形如x/y。表示散列长度为y,已经有值的元素是x个
HASH 数组操作函数
Keys(%h),values(%h);
用keys(%h)返回键列表,values(%h)返回值列表来显示。
返回的元素无顺序
each(%h) 循环
($key,$value)=each(%hash) 取出键值对。
不要先keys返回键,再$hash($k)返回值,效率不高。
循环中不要增加或删除元素,因为散列是无序的。最后返回undef
Exists 关键字是否存在:exists $h{'key'}
Undef(%h):删除散列,相当于 %=();
关联数组模拟数据结构
1.链表
每项含内容和指向下一个元素的指针,头指针指向第一个元素。
%list=("a","b",
"b","c",
"c","");
$header="a";
2.结构
struct{int i,int j}s;s.i=1;=>%s=("i","","j","");$s{"i"}=1;
$aoh->[0]{'k11'}
访问引用指向它的元素
HASH数组是一种数组
可以与数组相互赋值。 %h=@a,@a=%h,%h1=%h2
(%h,'k','v') 可以出现在=左边或右边
片断: $h{'a','b'}
HASH 数组是特殊的数组
%,{}
key=>value, 成对出现,不成对不能赋值。
不能"%hash"
显示为2/8 (用了多少)
关联数组是无序的
[oracle@jhoa 13]$ cat 1.pl
#!/usr/bin/perl
%h=(a=>1,b=>3);
print "%h
";
print %h;
$a=%h;
print "
$a
"; ##分配了8个值对的空间,已经用了2个
$aoh=[{'k11'=>'v11','k12'=>'v12'},
{'k21'=>'v21','k22'=>'v22'}];
$hash=$aoh->[0];
print "@{[%$hash]}
";
$hoh={k1=>
{key1=>'value1',key2=>'value2'},
k2=>{key1=>'val1',key2=>'val2'}
};
print "$hoh->{k1}{key1}
";
print "@{$hoh->{k1}}{'key1','key2'}";
[oracle@jhoa 13]$ perl 1.pl
%h
a1b3
2/8
k11 v11 k12 v12
value1
value1 value2[oracle@jhoa 13]$