今天看Perl by Example section 11.3,local和alias很不好理解,估计过些天就会忘。
(The Script) #!/usr/bin/perl
1 $colors="rainbow"; 2 @colors=("red", "green", "yellow" ); 3 &printit(*colors); # Which color is this?
4 sub printit{ 5 local(*whichone)=@_; # Must use local, not my with globs
6 print *whichone, "\n"; # The package is main
7 $whichone="Prism of Light"; # Alias for the scalar
8 $whichone[0]="PURPLE"; # Alias for the array
} 9 print "Out of subroutine.\n"; 10 print "\$colors is $colors.\n"; 11 print "\@colors is @colors.\n";
Output) 6 *main::colors 9 Out of subroutine. 10 $colors is Prism of Light. 11 @colors is PURPLE green yellow.
|
如果把第五行的括号去掉就会出现,modification of a read-only value attempted at这样的错误。
*aliasToSymbol表示这个变量是一个指向所有Symbol的alias
5行的@_就是这样一个变量,print @_;得到的结果就是*main::clolors,main模块的所有colors符号。
如果去掉括号,那么*whichone打印出来就是*main::1,而1是个常量,所以会报错。
但是为什么是1这个常量呢???
通常for (@aliasToArray) { $_ += 5; }
$_就是aliasToArray元素的别名。
alias叫做Symbolic References。
更好理解的则是Hard References—Pointers
但是有时候他们声明的太像了
*aliasToScalar=\$scalar;
*aliasToArray=\@array;
*aliasToHash=\%hash;
*aliasToFunc=\&func;
这些都是alias
my $arrayptr=\@array; # creates a pointer to an array
my $scalarptr=\$scalar; # creates a pointer to a scalar
my $hashptr=\%assoc_array; # creates a pointer to a hash
my $funcptr=\&subroutine; # creates a pointer to a subroutine
这些都是pointers
AUTOLOAD是一个特殊的变量,如果一个函数没有定义,则调用AUTOLOAD函数,并且把参数存在$AUTOLOAD变量中。
BEGIN和END都是函数,有点儿类似于一个文件的构造函数和析构函数。
use subs qw(fun1,fun2);
将fun1 fun2通过subs导出到函数列表。这样不需要前置声明,&,()暗示,fun1;就是一个函数调用。
阅读(1152) | 评论(0) | 转发(0) |