【perl】学习笔记(八)--复杂数据结构

本文主要介绍Perl的复杂数据结构,包括:

  1. 二维数组
  2. 哈希结构及复杂哈希结构

二维数组

Perl的数组由一对圆括号及用逗号分隔的元素组成(当然还有其他的声明方式)。

如:@array = ("apple","orange","pear");

二维数组声明方式有两种:

  1. @array = ([1,2,3],[4,5,6],[7,8,9]);这种方式中@array表示数组,如左图。
  2. $ref_array = [[1,2,3],[4,5,6],[7,8,9]];这种方式中$array表示数组的引用,如右图。

两种声明方式没有太大差别。最终都得到了一个二维数组。针对这两种声明方式,同时也有两种数组读取方式。

  1. $array[0][0];直接操作数组,指代第一个数组中第一个元素。
  2. $ref_array->[0][0];由于第二种方式是引用数组,所以使用“->”进行读取,读取的结果同上。
  3. 由于数组的内部仍是引用,所以两种方法的引用方式还可以写成:$array[0]->[0]和$ref_array->[0]->[0].

Perl使用push函数向数组中新增元素

perldoc文档关于push方法的说明

[html]  view plain  copy
  1. C:\>perldoc -f push  
  2.     push ARRAY,LIST  
  3.     push EXPR,LIST  
  4.             Treats ARRAY as a stack by appending the values of LIST to the  
  5.             把数组当做一个栈,将LIST列表值追加到数组的尾部。  
  6.             end of ARRAY. The length of ARRAY increases by the length of  
  7.             数组的长度根据LIST列表的长度进行增加。  
  8.             LIST. Has the same effect as  
  9.             和下面程序的作用一样,但是效率更高。  
  10.                 for $value (LIST) {  
  11.                     $ARRAY[++$#ARRAY] = $value;  
  12.                 }  
  13.               
  14.             but is more efficient. Returns the number of elements in the  
  15.             返回推送完成后数组的长度。  
  16.             array following the completed "push".  
  17.   
  18.             Starting with Perl 5.14, "push" can take a scalar EXPR, which  
  19.             从Perl5.14开始,push方法允许标量作为参数,标量必须是一个数组的引用。  
  20.             must hold a reference to an unblessed array. The argument will  
  21.             参数将被自动指向引用  
  22.             be dereferenced automatically. This aspect of "push" is  
  23.             push的这个特性是实验性的,可能在未来的版本中被改变。  
  24.             considered highly experimental. The exact behaviour may change  
  25.             in a future version of Perl.  
  26.   
  27.             To avoid confusing would-be users of your code who are running  
  28.             earlier versions of Perl with mysterious syntax errors, put this  
  29.             sort of thing at the top of your file to signal that your code  
  30.             will work *only* on Perls of a recent vintage:  
  31.   
  32.                 use 5.014;  # so push/pop/etc work on scalars (experimental)  

使用方法:

push 数组/数组的引用,数值/数值的列表;

针对上面两种操作方法,分别为

push $array[0],2;

push $array->[0],2;

使用delete删除二维数组元素

使用方法:

delete 指定位置元素;

delete方法并非将该元素删除,而是将其值设为undef,数组的长度不会改变,可以重新设置该元素值。

针对上面两种操作方法,分别为

delete $array[2][2];删除二维数组最后一个元素。

delete $array->[2][2];同上。

修改数组值

修改数组内容只需要取得数组元素位置,让后重新对其赋值即可。此处不做赘述。

[python]  view plain  copy
  1. #!user/bin/env perl  
  2. #array 2D  
  3. #第一种二维数组声明方法  
  4.     my @array = ([1,2,3],[4,5,6],[7,8,9]);  
  5.     #向二维数组第一个数组引用中新增一个值  
  6.     $num = push $array[0],"2";  
  7.     #$num代表新增后数组的长度  
  8.     print "the number in array after push:$num\n";  
  9.     print "new add element:$array[0][3]\n";  
  10.     #delete删除元素只是将其设置为undef,$num代表删除元素的位置。  
  11.     $num = delete $array[2][2];  
  12.     print "the position where deleted:$num\n";  
  13.     print "\$array[2][2]=$array[2][2]\n";  
  14.     #重新设置值  
  15.     $array[2][2] = 1000;  
  16.     print "\$array[2][2]=$array[2][2]\n";  
  17.     print "\$array[1][1]=$array[1][1]\n";  
  18.       
  19. print "\n-----------------------------------------------------------------\n";  
  20. #第二种二维数组声明方法  
  21.     my $ref = [[1,2,3],[4,5,6],[7,8,9]];  
  22.     #向二维数组第一个数组引用中新增一个值  
  23.     $num = push $ref->[0],"2";  
  24.     #$num代表新增后数组的长度  
  25.     print "the number in ref after push:$num\n";  
  26.     print "new add element:$ref->[0][3]\n";  
  27.     #delete删除元素只是将其设置为undef,$num代表删除元素的位置。  
  28.     $num = delete $ref->[2][2];  
  29.     print "the position where deleted:$num\n";  
  30.     print "\$ref[2][2]=$ref->[2][2]\n";  
  31.     #重新设置值  
  32.     $ref->[2][2] = 1000;  
  33.     print "\$ref[2][2]=$ref->[2][2]\n";  
  34.     print "\$ref[1][1]=$ref->[1][1]\n";  


哈希结构

哈希结构由成对的键值对构成。在内存中以散列值的方式存储,因此并不保持放入顺序。

哈希结构定义方式

  1. %hash = ("Tom",50,"Tony",80,"Cindy",85);这种定义方法,要求括号内元素必须成对出现,阅读上不方便。
  2. %hash = ("Tom"=>50,"Tony"=>80,"Cindy"=>85);推荐使用第二种方法,方便阅读且不易出错。

获取哈希结构的key

@key = keys %hash;

获取哈希结构的value

@value = values %hash;

通过key获取value

$value = $hash{key};

遍历哈希结构

foreach $key (keys %hash)

{

   print "key:$key value:$hash{$key}\n";

}

向哈希结构中增加元素

$hash{new_key}=value;

删除哈希结构中元素

delete $hash{key};

修改哈希结构的值

$hash{key} = new_value;

[python]  view plain  copy
  1. #!user/bin/env perl  
  2.   
  3. #new hash struts  
  4. my %English = (  
  5.     #key       #value  
  6.     "Tom"   => "50",  
  7.     "Tony"  => "80",  
  8.     "Cindy" => "90"  
  9. );  
  10.   
  11. #get keys  
  12. print "keys:\n";  
  13. print keys %English;#TonyTomCindy  
  14.   
  15. #get values  
  16. print "\nvalues:\n";  
  17. print values %English;#805090  
  18.   
  19. #get value by key  
  20. print "\nget value by key:Tom:$English{'Tom'}\n";  
  21.   
  22. #get all key value  
  23. print "list all key and value\n";  
  24. sub func_list{  
  25.     foreach $key (keys %English)  
  26.     {  
  27.         print "key:$key vlaue:$English{$key}\n"  
  28.     }  
  29. }  
  30. func_list;  
  31.   
  32. #add new element  
  33. print "add new element key:Taylor value:75\n";  
  34. $English{"Taylor"} = "75";  
  35. func_list;  
  36.   
  37. #delete element  
  38. print "delete element where key = Taylor\n";  
  39. delete $English{"Taylor"};  
  40. func_list;  
  41.   
  42. #update value  
  43. print "update value set Tom = 99\n";  
  44. $English{"Tom"} = "99";  
  45. func_list;  

复杂hash结构

含有数组的哈希结构

这种方式相对简单,将哈希结构的value替换为数组即可。

整体结构如下

%hash_with_array = {

  key1=>[element1,element2...],

  key2=>[element1,element2...]

};

由于通过key最终智能获取到数组的引用,因此还需要使用->读取这种结构中数组的值,数组的下标根据根据需求而定。

$value = $hash_wiht_array{key}->[0];

[python]  view plain  copy
  1. #hash with arrays  
  2.   
  3. my %arrayScore = (  
  4.     "Tom" => [50],  
  5.     "Tony"=> [85,80],  
  6.     "Cindy"=>[91,90]  
  7. );  
  8.   
  9. print "******Hash with array\n";  
  10. print "Tom $arrayScore{'Tom'}->[0]\n";  
  11. print "Tony $arrayScore{'Tony'}->[0]\n";  
  12. print "Cindy $arrayScore{'Cindy'}->[0]\n";  

含有哈希结构的数组

和前面一种结构相反,这种结构是将哈希结构作为数组的元素。

数组构成如下:

@array = (

  {

    key1=>value1,

    key2=>value2...

   },

  {

    key1=>value1,

    key2=>value2...

   }

);

数组中每个位置存放着对哈希结构的引用,同样需要使用->获取想要的值

$value = $array[0]->{key1};

[python]  view plain  copy
  1. #!user/bin/env perl  
  2.   
  3. #array struts with hash  
  4. my @scores = (  
  5.     {  
  6.         "Tom"   => "50",  
  7.         "Tony"  => "80",  
  8.         "Cindy" => "90"  
  9.     },  
  10.     {  
  11.         "Tom"   => "100",  
  12.         "Tony"  => "70",  
  13.     }  
  14. );  
  15.   
  16. print "******Scores:\n";  
  17.   
  18. for($i=0;$i<@scores;$i++)  
  19. {  
  20.     $tmp = $scores[$i];  
  21.     print qq(Tom $tmp->{"Tom"}\n);  
  22.     print qq(Tony $tmp->{"Tony"}\n);  
  23.     print qq(Cindy $tmp->{"Cindy"}\n);  
  24. }  

含有哈希结构的哈希结构

类似于第一种,只不过此时value存放的是哈希结构。

结构如下

%hash_with_hash = {

key1=>{

 key1=>value1,

 key2=>value2...

},

key2=>{

 key1=>value1,

 key2=>value2...

}

...

};

此结构的取值方式为

$value = $hash_with_hash{outer_key}->{inner_key};

[python]  view plain  copy
  1. #hash struts with hash  
  2. my %scores = (  
  3.     "English" => {  
  4.         "Tom"   => "50",  
  5.         "Tony"  => "80",  
  6.         "Cindy" => "90"  
  7.     },  
  8.     "Chinese" => {  
  9.         "Tony" => "80",  
  10.         "Cindy"=> "90"  
  11.     }  
  12. );  
  13.   
  14. print "******new scores\n";  
  15. print "English:\n";  
  16. print "Tom".$scores{"English"}->{"Tom"}."\n";  
  17. print "Tony".$scores{"English"}->{"Tony"}."\n";  
  18. print "Cindy".$scores{"English"}->{"Cindy"}."\n";  
  19. print "Chinese:\n";  
  20. print "Tony".$scores{"Chinese"}->{"Tony"}."\n";  
  21. print "Cindy".$scores{"Chinese"}->{"Cindy"}."\n"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值