加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 00:12:36 所属栏目:大数据 来源:网络整理
导读:**简写数组引用** 在解析数组引用的时候,如果括号里面是简单标量,我们可以去掉当中的大括号. @{$items}可以写成@$items ${$items}[1]可以写成$$items[1] 注意,如果括号里面不是简单标量,则不能简写. 例如@{$_[1]} 我们来看看第二个问题怎么解决,即如何在函数

**简写数组引用**

在解析数组引用的时候,如果括号里面是简单标量,我们可以去掉当中的大括号.

@{$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]}这里就没法用箭头取代括号了,箭头只用来取数组引用的元素。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读