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

[经验分享] 《中级perl》笔记 - 3, 数组引用 (2)

[复制链接]

尚未签到

发表于 2018-8-31 07:49:24 | 显示全部楼层 |阅读模式
  **简写数组引用**
  在解析数组引用的时候, 如果括号里面是简单标量,我们可以去掉当中的大括号.
  @{$items}可以写成@$items
  ${$items}[1]可以写成$$items[1]
  注意,如果括号里面不是简单标量,则不能简写. 例如@{$_[1]}
  我们来看看第二个问题怎么解决, 即如何在函数内改变作为函数参数的数组.
  sub check_required_items {
  my $who = shift;
  my $items = shift;
  my @missing = ( );
  my @required = qw(preserver sunscreen water_bottle jacket);
  for my $item (@required) {
  unless (grep $item eq $_, @$items) {
  print “$who is missing $item.\n”;
  push @missing, $item;
  }
  }
  if (@missing) {
  print “Adding @missing to @$items for $who.\n”;
  push @$items, @missing;
  }
  }
  列表@missing存储了遗漏物品, 在函数的最后,把@missing追加到@$items的后面,这样通过解析引用的数组,对原数组本身的数据进行了更新,而不仅仅是更新传给函数的一个数组副本.
  **内嵌的数据结构**
  引用是标量的其中一种,所以数组引用可以成为另一个数组的元素。
  my @skipper = qw(blue_shirt hat jacket preserver sunscreen);
  my @skipper_with_name = (‘Skipper’,  \@skipper);
  my @professor = qw(sunscreen water_bottle slide_rule batteries radio);
  my @professor_with_name = (‘Professor’,  \@professor);
  my @gilligan = qw(red_shirt hat lucky_socks water_bottle);
  my @gilligan_with_name = (‘Gilligan’,  \@gilligan);
  每个新数组,第一个元素都是其名字,第二个元素是所带物品的列表引用。我们可以把他们全部放在一个数组里。
  my @all_with_names = (
  \@skipper_with_name,
  \@professor_with_name,
  \@gilligan_with_name,
  );
  再来调用之前的函数,下面的代码就简单多了。
  for my $person (@all_with_names) {
  my $who = $$person[0];
  my $provisions_reference = $$person[1];
  check_required_items ($who, $provisions_reference);
  }
  当我们遍历@all_with_names 时,$person 依次为\@skipper_with_name  \@professor_with_name  \@gilligan_with_name。依次对其进行解析,得到相应的数组,每一个数组的第一个元素都是名字,第二个元素是物品列表的引用。
  上面的循环甚至可以写成:
  Check_required_items (@$_) for @all_with_names;
  **箭头写法**
  如果要访问内嵌数组引用的元素,我们可能需要这么写:
  ${$all_with_names[2]}[1]
  ${${$all_with_names[2]}[1]}[0]
  这写法、这语法会不会让人看得太蛋疼? 绝对蛋疼!
  Perl提供了另外一种更适合人类阅读的写法。任何${something}[$y]都可以简写成something -> [$y] 。也就是,在解析数组引用的时候,把中间的大括号去掉,然后把开头的美元符号换成中间的箭头号。 于是我们可以把上面2个丑陋的写法改成:
  $all_with_names[2] -> [1]
  $all_with_names[2] -> [1] -> [0]
  Perl还有另一条规则,如果箭头两边是相似的玩艺,那么箭头也可以省略,于是:
  $all_with_names[2] [1]
  $all_with_names[2][1][0]
  这样写就不那么蛋疼了吧:)
  设想一下我们对@all_with_names进行引用:
  my $root = \@all_with_names;
  我们取Gilligan携带的第一个工具:
  $root -> [2] -> [1] -> [0]  或者 $root -> [2][1][0]
  注意第一个箭头不能省略,如果省略了,$root[2]将不是对数组引用的解析,而是普通的直接数组,取其第三个元素,这是完全另外一个变量了。
  如果我们要取整个Gilligan的数组:
  @{$root->[2][1]}
  这里就没法用箭头取代括号了,箭头只用来取数组引用的元素。


运维网声明 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-559083-1-1.html 上篇帖子: 用Perl脚本实现FTP的文件下载 下篇帖子: perl脚本学习日记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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