一个有关typeglob问题的解答

来源:互联网 发布:python 压力测试框架 编辑:程序博客网 时间:2024/05/22 11:36

[免责声明]

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

 

 

 

 

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脊椎疼引起头晕怎么办 去英国探亲签证怎么办 地税国税合并人员怎么办 机场服务员老了怎么办 在国外没有钱了怎么办 被劫持为人质怎么办 在印度签证过期怎么办 办签证被拒怎么办 澳洲留学生怎么办新加坡签证 韩国交换生签证怎么办 没有钱还贷款怎么办 英国主动退学后怎么办 英国留学被劝退怎么办 英国留学签证被拒怎么办 签证纸丢了怎么办 日本的探亲签证怎么办 成都去港澳怎么办签证 在北京怎么办泰国签证 法院判决不准离婚怎么办 再婚小孩上户口怎么办 被供应商起诉了怎么办 离婚案原告撤诉怎么办 离婚起诉不到场怎么办 判决书判了败诉怎么办 对执行裁定不服怎么办 贴吧尺寸超限怎么办 usbkey密码忘了怎么办 农信房贷逾期几个小时怎么办 广东农信房贷逾期一天怎么办 三亚的房太潮了怎么办 没高中档案积分怎么办 临牌过期了怎么办 居住证凭证丢了怎么办 上海市居住证过期了怎么办 上海居住证积分不够怎么办 居住证登录密码忘记怎么办 投靠中考上海居住证怎么办 嫁入广州户口怎么办 上海积分扣完了怎么办 公立小学积分不够怎么办 查不到户口信息怎么办