设为首页 收藏本站
查看: 875|回复: 0

[经验分享] 列数组Program perl 数据结构

[复制链接]

尚未签到

发表于 2015-12-28 15:43:56 | 显示全部楼层 |阅读模式
  时间紧张,先记一笔,后续优化与完善。
  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
  数组的散列
  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
  散列的数组
  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
  散列的散列
  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
  文章结束给大家分享下程序员的一些笑话语录: 古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟

  
---------------------------------
原创文章 By            
列和数组
---------------------------------

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157625-1-1.html 上篇帖子: Perl Symbolic Reference 下篇帖子: 初恋Perl——文件操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表