ouzhoudijie 发表于 2018-8-31 07:49:24

《中级perl》笔记 - 3, 数组引用 (2)

  **简写数组引用**
  在解析数组引用的时候, 如果括号里面是简单标量,我们可以去掉当中的大括号.
  @{$items}可以写成@$items
  ${$items}可以写成$$items
  注意,如果括号里面不是简单标量,则不能简写. 例如@{$_}
  我们来看看第二个问题怎么解决, 即如何在函数内改变作为函数参数的数组.
  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;
  my $provisions_reference = $$person;
  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}
  ${${$all_with_names}}
  这写法、这语法会不会让人看得太蛋疼? 绝对蛋疼!
  Perl提供了另外一种更适合人类阅读的写法。任何${something}[$y]都可以简写成something -> [$y] 。也就是,在解析数组引用的时候,把中间的大括号去掉,然后把开头的美元符号换成中间的箭头号。 于是我们可以把上面2个丑陋的写法改成:
  $all_with_names ->
  $all_with_names -> ->
  Perl还有另一条规则,如果箭头两边是相似的玩艺,那么箭头也可以省略,于是:
  $all_with_names
  $all_with_names
  这样写就不那么蛋疼了吧:)
  设想一下我们对@all_with_names进行引用:
  my $root = \@all_with_names;
  我们取Gilligan携带的第一个工具:
  $root -> -> -> 或者 $root ->
  注意第一个箭头不能省略,如果省略了,$root将不是对数组引用的解析,而是普通的直接数组,取其第三个元素,这是完全另外一个变量了。
  如果我们要取整个Gilligan的数组:
  @{$root->}
  这里就没法用箭头取代括号了,箭头只用来取数组引用的元素。

页: [1]
查看完整版本: 《中级perl》笔记 - 3, 数组引用 (2)