Perl5中的引用和指针
一、引用简介
引用就是指针,可以指向变量、数组、哈希表甚至是子程序。
二、使用引用
如果$pointer的值为一个数组的指针,则通过形式@$pointer来访问数组中的元素。形式@$pointer的意义为“取出$pointer中的地址值当作数组使用”。类似的,%$pointer为指向哈希表中第一个元素的引用。
三、使用反斜线(\)操作符
反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用\创建变量又一个新的引用。下面为创建简单变量的引用的例子:
$variavle = 22;
$pointer = \$variable;
$ice = "jello";
$iceprt = \$ice;
引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。
四、引用和数组
关于Perl语言应该记住的最重要的一点可能是:Perl中的数组和哈希表始终是一维的。因此,数组和哈希表只保存标量值,不直接存贮数组或其它的复杂数据结构。数组的成员要么是数(或字符串)要么是引用。
对数组和哈希表可以象对简单变量一样使用反斜线操作符,数组的引用如下:
1 #!/usr/bin/perl
2 #
3 # Using Array references
4 #
5 $pointer = \@ARGV;
6 printf "\n Pointer Address of ARGV = $pointer\n";
7 $i = scalar(@$pointer);
8 printf "\n Number of arguments : $i \n";
9 $i = 0;
10 foreach (@$pointer) {
11 printf "$i : $$pointer[$i++]; \n";
12 }
运行结果如下:
$ test 1 2 3 4
Pointer Address of ARGV = ARRAY(0x806c378)
Number of arguments : 4
0 : 1;
1 : 2;
2 : 3;
3 : 4;
第11行用形式$$pointer[$i]列出所有元素
通过引用访问哈希表的元素形式为$$pointer{$index}
五、多维数组
六、子程序引用
perl中子程序的引用与C中函数的指针类似,构造方法如下:
$pointer_to_sub = sub {... declaration of sub ...};
通过所构造的引用调用子程序的方法为:
&$pointer_to_sub(parameters);
七、数组与子程序
#!/usr/bin/perl
@names = (mickey, goofy, daffy );
@phones = (5551234, 5554321, 666 );
$i = 0;
sub listem {
my ($a,$b) = @_;
foreach (@$a) {
print "a[$i] = " . @$a[$i] . " " . "\tb[$i] = " . @$b[$i] ."\n";
$i++;
}
}
&listem(\@names, \@phones);
结果输出如下:
a[0] = mickey b[0] = 5551234 a[1] = goofy b[1] = 5554321 a[2] = daffy b[2] = 666
PS
1. 当想传递给子程序的参数是多于一个的数组时,一定要使用引用;
2. 一定不要在子程序中使用形如(@variable) = @_;的语句处理参数,除非你想要把所有参数集中到一个长的数组中。
八、文件句柄的引用
有时,必须将同一信息输出到不同的文件,例如,某程序可能在一个实例中输出到屏幕,另一个输出到打印机,再一个输出到记录文件,甚至同时输出到这三个文件。相比较于每种处理写一个单独的语句,可以有更好的实现方式如下:
spitOut(\*STDIN);
spitOut(\*LPHANDLE);
spitOut(\*LOGHANDLE);
其中子程序spitOut的代码如下:
sub spitOut {
my $fh = shift;
print $fh "Gee Wilbur, I like this lettuce\n";
}
注意其中文件句柄引用的语法为\*FILEHANDLE。