免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1952 | 回复: 7
打印 上一主题 下一主题

关于glob类型 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-13 11:11 |只看该作者 |倒序浏览
本帖最后由 dadastan 于 2012-06-13 11:15 编辑

昨天天这里看了一个贴
解释了将普通scalar变量open为file handler的原理
其中使用了glog来实现,在将handler作为参数传递时候的确会用到glob
但是有一些问题还是不明白特此来请教下

例如:
上贴作者解释的代码是:
  1. my $fp;
  2. {
  3.         local *{'main::$fp'};
  4.         open(*{'main::$fp'}, "<", "urfile.txt");
  5.         my $tmp = *{'main::$fp'};
  6.         $fp = \$tmp;
  7. }
复制代码
这样,$p就可以作为handler了,我把block里更改了下改成
  1. local *FH;
  2. open *FH, "< urfile.txt";
  3. my $ko = *FH;
复制代码
这个$fp也可以作为handler。这里我省略了中间值$tmp也是可以的。
如果直接print $ko的话,得到的是:*main::FH

这让我产生疑问, 将一个glob量赋值给一个scalar,那这个scalar是一个什么值呢?
我直接print $ko.得到:*main::FH这是一个glob量,我便以为是将*FH作为字符串赋值给$ko,但实际并非如此
  1. my $tm = \$ko;
  2. print $tm;
复制代码
得到:  GLOB(0x9abcd60)  这说明$tm实际上是指向了一个GLOB的量,也就是说$ko变成了一个GLOB量
这就让我纳闷了

根据我的理解,glob应该有一个类似hash的机制寻找同名的变量地址,不过键只有 hash array scalar等等
但是不知道这个glob量本身到底是个什么,为什么赋值给普通scalar后,这个scalar也变成glob了

但是我接着上面有如下:
  1. foreach (sort keys %main::)
  2. {
  3. print $_."\n";
  4. }
复制代码
print出来的结果中有FH但是是没有ko的
这说明,符号表中根本就没有ko,它也不是一个glob

所以,总结下:一个glob赋值给一个scalar,这个scalar可以作为handler用,这个scalar本身的值是一个glob值,但是符号表中没有这个scalar的标识符的

所以我想问的就是:一个glob赋值给一个scalar到底是个什么原理啊???

论坛徽章:
0
2 [报告]
发表于 2012-06-13 18:13 |只看该作者
回复 1# dadastan


    貌似我知道为什么了,实际上
    如果有
  1. local *m;
  2. my $n = *m;
复制代码
那这个$n实际上也是一个glob
print一个指向$n的引用可以得到GLOB(0xXXXXX)这样格式的地址
也可以这样
  1. local *d = \$n;
  2. print *d;
复制代码
得到*main::m;

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2012-06-14 09:11 |只看该作者
dadastan 发表于 2012-06-13 18:13
回复 1# dadastan


不同类型之间的赋值本来就没什么意义都是规定的,这里实现者可以报错也可以选择猜下你的想法是想用 *FH 的引用

论坛徽章:
0
4 [报告]
发表于 2012-06-14 10:53 |只看该作者
回复 3# zhlong8



但是这里不是glob的引用啊,它直接就是*FH本身了,因为print它的引用的时候得到的是GLOB(0xXXXXX)格式数据
print *FH的时候得到的其实也只是*main::FH,而*FH析值的过程和$FH其实是一样的,就是遭到main::FH,然后找到main::FH中glob的部分(一个类似hash的方式)然后获取reference,然后对这个reference进行析值得到*main::FH
所以我猜,*FH也没什么特别的,可能*FH或许真的不需要得到什么特殊的东西,而只需要得到*main::FH这个值作为入口就行了
也正因为如此才可以赋值给SCALAR类型的数据,不过不知道在词法域的命名空间里面不知道是怎么弄的,导致指向它的引用居然是指向一个GLOB类型
这也正是我想知道的,求解啊

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2012-06-14 11:45 |只看该作者
dadastan 发表于 2012-06-14 10:53
回复 3# zhlong8


看来我也没搞清 glob 赋值给 scalar 到底是怎样的。GLOB 相当于一个对象它会记住自己的名字,这里的赋值只不过增加它的引用计数而已。 两者指向的还是同一个东西。

论坛徽章:
0
6 [报告]
发表于 2012-06-14 13:56 |只看该作者
回复 5# zhlong8


    引用计数应该只是针对词法域的,这里关键还是要看那个词法域里面是如何定义变量的,如果有数据类型这样的设计(例如类似glob)的话,那就可以解释了,但是我找不到类似的资料,愁

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2012-06-14 14:06 |只看该作者
dadastan 发表于 2012-06-14 13:56
回复 5# zhlong8


看不懂你愁什么,关于内部的数据结构那显然要看这个
http://cpansearch.perl.org/src/RURBAN/illguts-0.42/index-14.html

论坛徽章:
0
8 [报告]
发表于 2012-06-14 16:32 |只看该作者
回复 7# zhlong8


    Thanks
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP