一个有关typeglob问题的解答

[免责声明]

这里不是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";
}

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值