- 论坛徽章:
- 0
|
本帖最后由 dadastan 于 2012-06-13 11:15 编辑
昨天天这里看了一个贴
解释了将普通scalar变量open为file handler的原理
其中使用了glog来实现,在将handler作为参数传递时候的确会用到glob
但是有一些问题还是不明白特此来请教下
例如:
上贴作者解释的代码是:- my $fp;
- {
- local *{'main::$fp'};
- open(*{'main::$fp'}, "<", "urfile.txt");
- my $tmp = *{'main::$fp'};
- $fp = \$tmp;
- }
复制代码 这样,$p就可以作为handler了,我把block里更改了下改成- local *FH;
- open *FH, "< urfile.txt";
- my $ko = *FH;
复制代码 这个$fp也可以作为handler。这里我省略了中间值$tmp也是可以的。
如果直接print $ko的话,得到的是:*main::FH
这让我产生疑问, 将一个glob量赋值给一个scalar,那这个scalar是一个什么值呢?
我直接print $ko.得到:*main::FH这是一个glob量,我便以为是将*FH作为字符串赋值给$ko,但实际并非如此- my $tm = \$ko;
- print $tm;
复制代码 得到: GLOB(0x9abcd60) 这说明$tm实际上是指向了一个GLOB的量,也就是说$ko变成了一个GLOB量
这就让我纳闷了
根据我的理解,glob应该有一个类似hash的机制寻找同名的变量地址,不过键只有 hash array scalar等等
但是不知道这个glob量本身到底是个什么,为什么赋值给普通scalar后,这个scalar也变成glob了
但是我接着上面有如下:- foreach (sort keys %main::)
- {
- print $_."\n";
- }
复制代码 print出来的结果中有FH但是是没有ko的
这说明,符号表中根本就没有ko,它也不是一个glob
所以,总结下:一个glob赋值给一个scalar,这个scalar可以作为handler用,这个scalar本身的值是一个glob值,但是符号表中没有这个scalar的标识符的
所以我想问的就是:一个glob赋值给一个scalar到底是个什么原理啊???
|
|