一个有关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";
}
- 一个有关typeglob问题的解答
- csdn一个有关影像处理问题帖子的解答
- 对一个问题的解答
- 对一个问题的解答
- 一个小问题的解答
- 有关“树上剩余几只鸟”的问题的思考及解答
- 有关Applet无法在IE中显示问题的解答!
- 一个solaris的内核问题的解答
- 一个solaris的内核问题的解答
- 针对事务的一个问题的解答
- 针对事务的一个问题的解答
- 一个有关AWT 的问题
- 一个有关HTML的问题
- 有关宏的一个问题
- 有关日期的一个问题
- 解答一个数组全排列的问题
- 一个简单的Shell 解答网友问题
- 一个js闭包问题的解答
- vc 托盘
- tomcat配置安装(压缩版)
- JAVASCRIPT基础学习篇(7)--ECMAScript Basic3(EcmaScript 运算符)
- SOA现状调查:SOA没死但仍存在许多挑战
- 第一次
- 一个有关typeglob问题的解答
- 路漫漫兮其修远
- IBM助力美的整合数据交换平台
- js 防止按键返回前一页面
- premiere学习探讨
- (JS+HTML)简单的在线计算器(送给初学者们)
- 我在csdn安了个家了!
- 深表歉意
- 资料买卖还是到作品吧