Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318707
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类:

2009-03-23 22:56:28

今天看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;就是一个函数调用。
阅读(1089) | 评论(0) | 转发(0) |
0

上一篇:创建QT开发环境

下一篇:安装龙卷风

给主人留下些什么吧!~~