引用
- 引用就是指针,可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。Perl5中的两种引用类型为硬引用和符号引用。符号引用含有变量的名字,它对运行时创建变量名并定位很有用,基本上,符号引用就象文件名或UNIX系统中的软链接。而硬引用则象文件系统中的硬链接
- 有多种构建引用的方法,几乎可以对任何数据建立引用,如数组、简单变量、子程序、文件句柄,以及
C程序员会感兴趣的引用。Perl使你有能力写出把自己都搞糊涂的极其复杂的代码。:)
- 使用反斜线(\)操作符, 反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用\创建变量又一个新的引用。下面为创建简单变量的引用的例子:
$variavle = 22;
$pointer = \$variable;
$ice = "jello";
$iceprt = \$ice; - 引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。即使最初的引用$variable销毁了,仍然可以通过$pointer访问该值,这是一个硬引用,所以必须同时销毁$pointer和$variable以便该空间释放到内存池中。到$pointer给出地址,而$$pointer给出$variavle的值
- 使用反斜线(\)操作符, 反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用\创建变量又一个新的引用。下面为创建简单变量的引用的例子:
- 引用和数组, 对数组和哈希表可以象对简单变量一样使用反斜线操作符.数组的引用如下:
$pointer = \@ARGV;
printf "\n Pointer Address of ARGV = $pointer\n";
$i = scalar(@$pointer);
printf "\n Number of arguments : $i \n";
$i = 0;
foreach (@$pointer) {
printf "$i : $$pointer[$i++]; \n";}
对于哈希的引用可以用%$pointer进行引用。哈希键值的引用$$pointer{$i},${$pointer}{$i} ,$pointer->{$i}\\
- 多维数组或哈希,利用数组或哈希的值可以是引用的特点,可以创建多维数组或哈希,还可以是混合的哈希数组,数组哈希之类的数据结构。
- 子程序的引用。子程序的返回值不仅限于数据,还可以返回子程序的引用。返回的子程序在调用处执行,但却是在最初被创建的调用处被设置
sub errorMsg {
my $lvl = shift;
# define the subroutine to run when called. # return sub {
my $msg = shift; # Define the error type now.
print "Err Level $lvl:$msg\n"; }; # print later.
}
$severe = errorMsg("Severe");
$fatal = errorMsg("Fatal");
$annoy = errorMsg("Annoying");
&$severe("Divide by zero");
&$fatal("Did you forget to use a semi-colon?");
&$annoy("Uninitialized variable in use");
结果输出如下:
Err Level Severe:Divide by zero
Err Level Fatal:Did you forget to use a semi-colon?
Err Level Annoying:Uninitialized variable in use
- 数组与子程序。 数组利于管理相关数据,本节讨论如何向子程序传递多个数组。前面我们讲过用@_传递子程序的参数,但是@_是一个单维数组,不管你传递的参数是多少个数组,都按序存贮在@_中,故用形如my(@a,@b)=@_; 的语句来获取参数值时,全部值都赋给了@a,而@b为空。那么怎么把一个以上的数组传递给子程序呢?方法是用引用。将实参数组以应用的方式传给子函数。
- 文件句柄的引用.有时,必须将同一信息输出到不同的文件,例如,某程序可能在一个实例中输出到屏幕,另一个输出到打印机,再一个输出到记录文件,甚至同时输出到这三个文件。相比较于每种处理写一个单独的语句,可以有更好的实现方式如下:
spitOut(\*STDIN);
spitOut(\*LPHANDLE);
spitOut(\*LOGHANDLE);
其中子程序spitOut的代码如下:
sub spitOut {
my $fh = shift;
print $fh "Gee Wilbur, I like this lettuce\n";
}