[免责声明]
这里不是Perl的百科全书,这里http://www.perl.org/才是。
个人理解,难免有错。
[预备知识]
在Perl中,由our声明的变量均会被视为全局变量;由my声明的变量均会被视为局部变量;由local声明的变量是同名全局变量的本地拷贝。或者说:由local声明的变量均会被视为全局变量。
所有的全局变量,既在包符号表中,也会被登记在全局符号表中。可以通过两种形来访问一个全局变量。第一种是包符号表,第二种是typeglob。
举例:
our $test;
$main::test = "你"; # package style
print ${*main::test}; # typeglob style
${*main::test} = "好"; # typeglob style
print $main::test; # package style
结果:你好
这上面四行都是访问了同一变量,但采用了不同的形式。
[问题和解答]
问题:为什么下面第五行不可以是/*FH?
sub newopen {
my $path = shift;
local *FH;
open(FH,$path);
return *FH;
}
$fh = newopen("c://fh.txt");
while(<$fh>){
print "$_/n";
}
解答:原因在于第三行的声明,FH会被视为一个全局变量,在newopen()函数中生成了一个FH的本地拷贝。在这个函数中,对FH的所有赋值只影响到这个本地拷贝。当newopen()执行完毕时,这个本地拷贝的生命结束,全局变量FH仍是空值。因此,第四行open(FH,$path)只会对这个本地拷贝赋值,第五行如果返回/*FH,第七行相当于$fh = *FH,$fh也是空值,当然整个程序会出错。
下面这些都不会出错。不用我提醒,你的C盘下面需要有一个fh.txt文件吧!
sub newopen {
my $path = shift;
our $FH; # 使用our声明一个全局变量
open(FH,$path);
return /*FH;
}
$fh = newopen("c://fh.txt");
while(<$fh>){
print "$_/n";
}
sub newopen {
my $path = shift;
my $FH; # 使用my声明一个局部变量
open($FH,$path);
return $FH; # 返回这个局部变量
}
$fh = newopen("c://fh.txt");
while(<$fh>){
print "$_/n";
}