在 C 里,间接的最常见的形式就是指针,它
可以让一个变量保存另外一个变量的内存地址。在 Perl 里,间接的最常见的形式是引用。
举例来说,假如你创建了一个指向某个词法
范围数组 @array 的硬引用。那么,即使在 @array 超出了范围之后,该引用以及它所
引用的参考物也仍然继续存在。一个引用只有在对它的所有引用都消失之后才会被摧毁。
8.2 创建引用:
8.2.2 匿名数据
匿名数组组合器:
你可以用方括弧创建一个创建一个指向匿名数组的引用:
[root@wx03 3]# cat t5.pl
$arrayref = [1, 2, ['a', 'b', 'c', 'd']];
print $arrayref->[2]->[2];
print "\n";
[root@wx03 3]# perl t5.pl
c
[root@wx03 3]# cat t6.pl
$table = [ [ "john", 47, "brown", 186], [ "mary", 23, "hazel", 128], [ "bill", 35, "blue", 157] ];
print $table->[1]->[0];
print "\n";
[root@wx03 3]# perl t6.pl
mary
匿名散列组合器:
[root@wx03 3]# cat t7.pl
$hashref = {
'Adam' => 'Eve',
'Clyde' => $bonnie,
'Antony' => 'Cleo' . 'patra',
};
print $hashref->{Antony};
print "\n";
[root@wx03 3]# perl t7.pl
Cleopatra
[root@wx03 3]# cat t8.pl
$table = {
"john" => [47, "brown", 186],
"mary" => [23, "hazel", 128],
"bill" => [35, "blue", 157],
};
print $table->{mary}->[2];
print "\n";
[root@wx03 3]# perl t8.pl
128
[root@wx03 3]# cat t9.pl
$table = {
"john" => { age => 47,
eyes => "brown",
weight => 186,
},
"mary" => { age => 23,
eyes => "hazel",
weight => 128,
},
"bill" => { age => 35,
eyes => "blue",
weight => 157,
},
213
};
print $table->{mary}{eyes};
print "\n";
[root@wx03 3]# perl t9.pl
hazel
匿名子过程组合器:
你可以通过用不带子过程名字的 sub 创建一个匿名子过程:
[root@wx03 3]# cat t10.pl
$coderef = sub { print "Boink!\n" };
print &$coderef;
print "\n";
[root@wx03 3]# perl t10.pl
Boink!
1
对象构造器:
特别是那些叫构造器的特殊子过程创建并返回指向对象的
引用。
[root@wx03 3]# cat t11.pl
$var="abc123";
$scalarref=\$var;
print $scalarref;
print "\n";
$bar = ${$scalarref};
print $bar;
print "\n";
[root@wx03 3]# perl t11.pl
SCALAR(0x1486b18)
abc123
把一个 BLOCK 块当作变量名用:
使用箭头操作符:
使用对象方法:
[root@wx03 3]# cat t12.pl
$john = [ {age => 1, eyes => 2, weight => 3}, 47, "brown", 186 ];
print $john->[0]->{eyes};
print "\n";
[root@wx03 3]# perl t12.pl
2
闭合(闭包):
一个指向一个词法变量的引用:
[root@wx03 3]# cat t13.pl
{
my $critter = "camel";
$critterref = \$critter;
print "first.........\n";
print "\$critter is $critter\n";
};
print "second............\n";
print $$critterref;
print "\n";
[root@wx03 3]# perl t13.pl
first.........
$critter is camel
second............
camel
$$critterref 的数值仍将是“camel”,即使在离开闭合的花括弧之后 $critter 消失了也如
此。
$critterref 也可以指向一个指向了 $critter 的子过程:
[root@wx03 3]# cat t14.pl
{
my $critter = "camel";
$critterref = sub { return $critter };
print "1---------\n";
print &$critterref;
print "\n";
};
print "2---------\n";
print &$critterref;
print "\n";
[root@wx03 3]# perl t14.pl
1---------
camel
2---------
camel
这是一个闭合(闭包)
闭合的另外一个用途就是函数生成器,也就是说,创建和返回全新函数的函数。下面是一个
用闭合实现的函数生成器的例子:
嵌套的子过程: