|
**简写数组引用**
在解析数组引用的时候, 如果括号里面是简单标量,我们可以去掉当中的大括号.
@{$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]}
这里就没法用箭头取代括号了,箭头只用来取数组引用的元素。
|
|
|