在C里,间接的最常见的形式就是指针,它可以让一个变量保存另外一个变量的内存地址。
在Perl里,间接的最常见的形式是引用。
什么是引用?
在我们的例子里,$vitals[0] 的值是”john”.
也就是说它正好包含另外一个(全局)变量的名字,我们说第一个变量提到了第二个变量,
并且这种参考叫符号引用,因为Perl必须在一个符号表找出@john 来才到能找到它。
8.2 创建引用
创建引用的方法有好多种,我们在讲述它们的时候大多数先描述它们,然后才解释如何使用(解引用)所生成的引用。
8.2.1 反斜杠操作符
你可以用一个反斜杠创建一个指向任何命名变量或者子过程的引用。(
你还可以把它用于一个匿名标量值,比如7或”camel”,尽管你通常并不需要这些东西)乍一看,这个操作符的作用类似
C里的&(取址)操作符
[root@master Webqq]# cat t12.pl
$scalarred = $foo;
$constref = 186_282.42;
$arrayref = @ARGV;
$hashref = \%ENV;
$coderef = &handler;
print “$scalarred is $scalarred ”;
print “$constref is $constref ”;
print “$arrayref is $arrayref ”;
[root@master Webqq]# perl t12.pl
$arrayref is ARRAY(0x10b4068
8.2.2.1 匿名数组组合器
你可以用方括号创建一个指向匿名属组的引用:
$arrayref = [1,2,[‘a’,’b’,’c’,’d’]];
[root@master Webqq]# cat t13.pl
[root@master Webqq]# perl t13.pl
c
2维数组,第2列数组的第3个元素
现在我们有一个方法来表示我们本章开头的表:
[root@master Webqq]# cat t13.pl
print
[root@master Webqq]# perl t13.pl
472335[root@master Webqq]#
8.2.2.2 匿名散列组合器
你可以用花括号创建一个指向匿名散列的引用:
[root@master Webqq]# cat t14.pl
print “
”;
print $$hashref{Antony};
[root@master Webqq]# perl t14.pl
HASH(0x20f6d48)
Cleopatra[root@master Webqq]#
[root@master Webqq]#
[root@master Webqq]# cat t15.pl
print “
”;
print
[root@master Webqq]# perl t15.pl
HASH(0x18c9710)
brown186[root@master Webqq]#
这是一个数组散列,选择最好的数据结构是难度很高的工种,下一章专门讲这个。
下面介绍散列的散列
[root@master Webqq]# cat t16.pl
print “
”;
print $$table{john}{age};
[root@master Webqq]# perl t16.pl
HASH(0xe696a8)
47[root@master Webqq]#
8.2.2.3 匿名子过程组合器
你可以通过不带子过程名字的sub创建一个匿名子过程
[root@master Webqq]# cat t17.pl
coderef = sub { print "Boink!
" }; # 现在 &coderef 打印 “Boink!”
print &$coderef;
[root@master Webqq]# perl t17.pl
Boink!
1[root@master Webqq]#
&$$coderef; 子程序解引用