zoukankan      html  css  js  c++  java
  • Program perl 数据结构

    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

  • 相关阅读:
    PAT甲题题解-1017. Queueing at Bank (25)-模拟
    PAT甲题题解-1015. Reversible Primes (20)-素数
    PAT甲题题解-1013. Battle Over Cities (25)-求联通分支个数
    PAT甲题题解-1012. The Best Rank (25)-排序水题
    POJ 3384 Feng Shui
    POJ 3525 Most Distant Point from the Sea
    HDU 1115 Lifting the Stone
    FJ省队集训最终测试 T2
    FJ省队集训最终测试 T3
    考前总结小本本
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3111465.html
Copyright © 2011-2022 走看看