Program perl 数据结构

来源:互联网 发布:windows bat date 编辑:程序博客网 时间:2024/05/23 16:55

Table of Contents

  • 1 数组的数组
    • 1.1 创建和访问二维数组
    • 1.2 自行生长
    • 1.3 访问和打印
    • 1.4 片段
  • 2 数组的散列
    • 2.1 数组的散列的组成
    • 2.2 生成数组的散列
    • 2.3 访问和打印数组
  • 3 散列的数组
    • 3.1 散列的数组的组成。
    • 3.2 生成散列的数组
    • 3.3 访问和打印散列的数组
  • 4 散列的散列
    • 4.1 散列的散列的组成
    • 4.2 生成散列的散列
    • 4.3 访问和打印散列的散列
  • 5 函数的散列
  • 6 以上内容摘自大骆驼,谢谢

1 数组的数组

1.1 创建和访问二维数组

创建是最简单的,举例:

 1:  @AoA = (["fruit","ball"], 2:          ["home","bart","marge"], 3:          ["george","jane","elory"]); 4:  print $AoA[2]->[1]; 5:  #每一对相邻的大括号或中括号之间有一个隐含的->,所以也可以这样写 6:  print $AoA[2][1]; 7:   8:  #整个列表被封装在小括号中,而不是中括号中,因为是给列表赋值, 9:  #而不是给引用赋值,如果要创建一个指向数组的引用,那么你要这样10:  $ref_to_AoA =[ ["fred","barney","pebbles","bamm"],11:                 ["homer","bart","marge","maggie",]12:      ];13:  print $ref_to_AoA->[2][3];14:  #注意这里有在中括号前面的箭头符号。因为这是引用,所以要在前面加上->15:  16:  #还有一点就是可以利用负数索引从数组后面向前计数,17:  $AoA[0][-2];18:  #表示第一行的倒数第二个元素

1.2 自行生长

我们读入一个数据结构,是一个纯文本文件,每一行是一个结构的一行,并且没行 包含由空白分割的元素。

 1:  while(<>) 2:  { 3:      chomp; 4:      @tmp = split; 5:      push @AoA,[@tmp]; 6:  } 7:  #或者直接不用命名那个数组 8:  while(<>) 9:  {10:      push @AoA, [split];11:  }12:  #如果想要引用指向一个数组的数组,可以这样13:  while(<>)14:  {15:      push @ref_to_AoA,[split];16:  }17:  #如果要向数组中增加列,还是使用简单的赋值18:  #如果向一个存在的行中附加一个新列19:  push @{@AOA[0]},"wilma","betty";20:  #注意push的参数必须以@开头

1.3 访问和打印

 1:  #单元素打印 2:  print $AoA[3][2]; 3:  #遍历整个数组 4:  for $now (@AoA) 5:  { 6:      print "@$row\n"; 7:  } 8:  #如果你想追踪脚标 9:  for $i (0..$#AoA)10:  {11:      print "row $i is:@{$AoA[$i]}\n";12:  }13:  #或者14:  for $i (0..$#AoA)15:  {16:      for $j (0..$#{$AoA[$i]})17:      {18:          print "element $i $j is $AoA[$i][$j]\n";19:      }20:  }21:  #为了简化上面的程序,我们可以使用临时变量,让事情变的简单。22:  for $i (0..$#AoA)23:  {24:      $row = $AoA[$i];25:      for $j (0..$@{$row})26:      {27:          print "element $i $j is $row->[$j]\n";28:      }29:  }

1.4 片段

如果要访问一个多维数组的某一片段的元素,你可以用循环把变量一个个的取出来。

 1:  @part = (); 2:  for ($y = 7 ;$y <13 ;$y++) 3:  { 4:      push @part,$AoA[4][$y]; 5:  } 6:  #这个循环可以用一个数组片段来替代 7:  @part = @{$AoA[4]} [7..12]; 8:  #如果要一个二维片段,同样也可以通过循环来获得 9:  #也可以用上面刚学到的方法10:  for ($x=4;$x<=9;$x++)11:  {12:      push @new_AoA,[@{$AoA[$x]} [7..12]];13:  }14:  #如果你经常这么做,可以写一个子程序,或者到CPAN上下载一个15:  #PDL(perl data language)模块

2 数组的散列

关于这个名称,我们可以这样理解,数组的散列是由“数组”组成的散列, 我们可以首先可以根据散列的key快速找到数组,然后再访问数组。

2.1 数组的散列的组成

1:  %HoA = ( flintstones =>["fred","barney"],2:           jetsons     =>["george","jane","elroy"],3:      );4:  #向散列增加另一个数组5:  $HoA{teletubbies} = ["tinky","dispay","laa",];

2.2 生成数组的散列

从下面格式的文件中读取: flintsotnes: fred barney wilma dino
jetsons: george jane elroy
simpsons: homer marge bart
下面是填充数组的散列的技巧

 1:  while(<>) 2:  { 3:      next unless s/^(.*?):\s*//; 4:      $HoA{$i}=[split]; 5:  } 6:  #或者 7:  while($line = <>) 8:  { 9:      ($who,$rest)=split/:\s*/,$line,2;10:      @fields=split ' ',$rest;11:      $HoA{$who}=[@fields];12:  }13:  #可以通过一下方法向已存在的数组追加新的成员14:  push @{$HoA{flintstones}},"wilma","pebbles";

2.3 访问和打印数组

打印所有的元素

 1:  for $family (keys %HoA) 2:  { 3:      print "$family: @{$HoA{$family}}\n"; 4:  } 5:  #你可以为数组增加索引 6:  for $family (keys %HoA) 7:  { 8:      print "$family: "; 9:      for $i (0..$#{$HoA{$family}})10:      {11:          print " $i = $HoA{$family}[$i]";12:      }13:      print "\n";14:  }15:  #或者通过以数组拥有的元素个数对他们排序16:  for $family (sort {@{$HoA{$b}} <=> @{$HoA{$a}}} keys %HoA)17:  {18:      print "$family: @{$HoA{$family}}\n";19:  }20:  #也可以以元素的个数对数组排序,然后以元素的ASCII码顺序进行排序21:  for $family (sort {@{$HoA{$b}}<=>@{$HoA{$a}}} keys %HoA)22:  {23:      print "$family: ",join(",",sort @{$HoA{$family}}),"\n";24:  }

3 散列的数组

这个名称和上一个名称容易混淆,散列的数组,就是由“散列“组成的”数组“, 我们的本意是对一堆数据,想要按照顺序访问他们。并且每一个记录后面又 包含key/value对

3.1 散列的数组的组成。

 1:  @AoH = ({husband => "barney", 2:           wife    => "betty", 3:           son     => "bamm", 4:          }, 5:          {husband => "george", 6:           wife    => "jane", 7:           son     => "elroy", 8:          }, 9:          {husband => "homer",10:           wife    => "marge",11:           son     => "bart",12:          },13:  );14:  15:  16:  #向数组中添加另外一个散列,17:  push @AoH,{husband => "fred",wife => "wilma",daughter=>"pebbles"};

3.2 生成散列的数组

从文件中读取下面的格式
husband=fred friend=barney

 1:  while(<>) 2:  { 3:      $rec = {}; 4:      for $field (split) 5:      { 6:          ($key,$value) = split/=/,$field; 7:          $rec->{$key} = $value; 8:      } 9:      push @AoH,$rec;10:  }11:  12:  #或者用下面更简单的方法13:  while(<>)14:  {15:      push @AoH,{split /[\s=]+/};16:  }17:  18:  #可以向下面这样向一个现存的散列添加新成员19:  $AoH[0]{pet} = "dino";20:  $AoH[2]{pet} = "santa's";

3.3 访问和打印散列的数组

用下面的方法设置一个特定散列的键/值对

 1:  $AoH[0]{husband} = "fred"; 2:  #把第二个数组的丈夫变成大写 3:  $AoH[1]{husband} = ~s/(\w)/\u$1/; 4:   5:  #打印所有数据的方法: 6:  for $href (@AoH) 7:  { 8:      print "{ "; 9:      for $role (keys %$href)10:      {11:          print "$role=$href->{$role}";12:      }13:      print "}\n";14:  }15:  16:  #带着索引打印17:  for $i (0..$#AoH)18:  {19:      print "$i is {";20:      for $role (keys %{$AoH[$i]})21:      {22:          print "$role=$AoH[$i]{$role} ";23:      }24:      print "}\n";25:  }

4 散列的散列

多维散列是Perl中最灵活的嵌套结构。

4.1 散列的散列的组成

 1:  %HoH=( 2:  flintstones=> 3:  { 4:      husband   => "fred", 5:      pal       => "barney", 6:  }, 7:  jetsons  => 8:  { 9:      husband   => "george",10:      wife      => "jane",11:      "his boy" => "elroy",12:  },13:  simpsons =>14:  {15:      husband   => "homer",16:      wife      => "marge",17:      kid       => "bart",18:  },19:      );20:  #向%HoH中增加一个匿名散列21:  $HoH{mash} = {22:      captain => "pierce",23:      major   => "burns",24:      corporal=> "radar",25:  }

4.2 生成散列的散列

从下面格式的文件中读取数据:

1:  flintstones: husband=fred pal=barney wife=wilma pet=dino

我们可以使用下面两个循环之一来完成任务

 1:  while(<>) 2:  { 3:      next unless s/^(.*?):\S*//; 4:      $who = $1; 5:      for $field (split) 6:      { 7:          ($key,$value)=split/=/,$field; 8:          $HoH{$who}{$key} = $value; 9:      }10:  }11:  12:  #或者13:  while(<>)14:  {15:      next unless s/^(.*?):\S*//;16:      $who = $1;17:      $rec = {};18:      $HoH{$who} = $rec;19:      for $field (split)20:      {21:          ($key,$value)= split/=/,$field;22:          $rec->{$key}= $value;23:      }24:  }

4.3 访问和打印散列的散列

 1:  #设置键/值对 2:  $HOH{flintstones}{wife} = "wilma"; 3:   4:  #要把某个键/值对变成大写,可对该元素应用替换 5:  $HoH{jetsons}{'his boy'} =~s/(\w)/\u$1/; 6:   7:  #打印所有的元素,利用先后遍历内外层散列键的方法 8:  for $family (keys %HoH) 9:  {10:      print "$family: ";11:      for $role (keys %{$HoH{$family}})12:      {13:          print "$role = $person ";14:      }15:      print "\n";16:  }17:  18:  #在非常大的散列中,可以用each同时把键和值都检索出来19:  while (($family,$roles) = each %HoH)20:  {21:      print "$family: ";22:      while (($role,$person) = each %$roles)23:      {24:          print "$role = $person";25:      }26:      print "\n";27:  }28:  29:  #排序输出30:  for $family (sort keys %HoH)31:  {32:      print "$family: ";33:      for $role (sort keys %{$HoH{$family}})34:      {35:          print "$role=$HoH{$family}{$role} ";36:      }37:      print "\n";38:  }

5 函数的散列

6 以上内容摘自大骆驼,谢谢

Author: GRC <grc@grc>

Date: 2013-05-31 19:22:49 CST

HTML generated by org-mode 6.33x in emacs 23

原创粉丝点击