免费注册 查看新帖 |

Chinaunix

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

一个关于typeglob的诡异问题,求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-27 23:09 |只看该作者 |倒序浏览
  1. #!/usr/bin/perl -w
  2. use 5.010;
  3. use strict;

  4. our $foo = 'foo';
  5. my $k = *foo;

  6. ${*{*{*{$k}}}} = 'k';
  7. say $foo;
  8. ${*{*{*{*foo}}}} = 'glob';
  9. say $foo;
  10. *{*{*{*{$k}}}} = \'k2';
  11. say $foo;
  12. *{*{*{*{*foo}}}} = \'glob2';
  13. say $foo;
复制代码
输出:
k
glob
glob
glob2

第一种方式的赋值,无论是用$k还是*foo都能成功,但第二种方式的赋值,用$k却无法起效(但是也无警告不报错)

查了许多资料依然没找到为什么,请知道的人说下,多谢

论坛徽章:
0
2 [报告]
发表于 2011-10-27 23:40 |只看该作者
没太多意义的写法。
知道 *foo 与 *{*foo} 是一个东西就明了。

论坛徽章:
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 [报告]
发表于 2011-10-28 00:00 |只看该作者
本帖最后由 zhlong8 于 2011-10-28 00:15 编辑

5.14 下好像不大一样啊,我的是
k
glob
k2
glob2

实现不懂 *{*k} 有什么意义就查了下文档,在 perlref 中

A typeglob may be dereferenced the same way a reference can, because the dereference syntax always indicates the type of reference desired. So ${*foo} and ${\$foo} both indicate the same scalar variable.


也就是说 *{*foo} 外面的 * 需要里面是一个 typeglob 引用,所以里面的 typeglob 会当做 typeglob 的引用来处理,即 *{*foo} === *foo。因为对 typeglob 解引用逻辑上没什么意义这里应该算是约定。

所以,第一个 ${*{*{*{$k}}}} = 'k'; 等于 ${*{*{*{*foo}}}} = 'k' 等于 ${*foo} = 'k'; 等于 $foo = 'k';
第二个 ${*{*{*{*foo}}}} = 'glob'; 同上
第三个*{*{*{*{$k}}}} = \'k2'; 等于 *{*{*{*{*foo}}}} = \'k2';  等价于 *foo = \'k2';
第四个 *{*{*{*{*foo}}}} = \'glob2'; 同上一个,等价于 *foo = \'glob2';

论坛徽章:
0
4
发表于 2011-10-28 00:21
回复 3# zhlong8


    多谢3楼的解答。

手头是5.12版本的,确实和我在主楼写的显示一样,然后去翻了下5.12-5.14的升级,终于找到了问题:

Some Perl operators did not distinguish between these two types of globs. This would result in strange behaviour in edge cases: untie $scalar would not untie the scalar if the last thing assigned to it was a glob (because it treated it as untie *$scalar , which unties a handle). Assignment to a glob slot (such as *$glob = \@some_array ) would simply assign \@some_array to $glob .


原文链接:http://perldoc.perl.org/5.14.0/perldelta.html#Selected-Bug-Fixes

标量和其中存储的typeglob的行为区别是一个bug,现在已经修复:

To fix this, the *{} operator (including its *foo and *$foo forms) has been modified to make a new immutable glob if its operand is a glob copy. This allows operators that make a distinction between globs and scalars to be modified to treat only immutable globs as globs. (tie, tied and untie have been left as they are for compatibility's sake, but will warn. See Deprecations.)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP