免费注册 查看新帖 |

Chinaunix

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

问段代码 这个sub { ${ $_[0] } } 啥意思? [复制链接]

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

  1. package ShiftString;

  2. use overload
  3.     '>>' => \&right_shift,
  4.     '""' => sub { ${ $_[0] } };

  5. sub new {
  6.     my $class = shift;
  7.     my $value = shift;
  8.     return bless \$value => $class;
  9. }

  10. sub right_shift {
  11.     my ($x, $y) = @_;
  12.     my $value = $x;
  13.     substr($value, -$y) = "";
  14.     return bless \$value => ref($x);
  15. }

  16. $camel = ShiftString->new("Camel");
  17. $ram = $camel >> 2;     #****************貌似 $camel 调用 overload的 “” 返回 dereference “Camel” 才对啊。
  18. print $ram;            # Cam

复制代码
sub right_shift {
    my ($x, $y) = @_;
    my $value = $x;
    substr($value, -$y) = "";
    return bless \$value => ref($x);
}
这部分里面my $value = $x; 应该是$value = $$x;
我的理解是 匿名数组 返回 第一个参数的  dereference
但是看这个例子 貌似 $camel 应该返回 字串符

然后 sub right_shift  
里面竟然用 $$X 又一次 dereference????

论坛徽章:
0
2 [报告]
发表于 2010-04-07 12:55 |只看该作者
不能连续输入两个$$啊
code里面
my $value = $$x;

论坛徽章:
0
3 [报告]
发表于 2010-04-07 13:00 |只看该作者
本帖最后由 3gtan 于 2010-04-07 13:56 编辑

我在
sub right_shift {
    my ($x, $y) = @_;
    my $value = $$x;
    print $x,$$x,"\n";
    substr($value, -$y) = "";
    return bless \$value => ref($x);
}
的里面加上print了
结果是 $x  和$$x 的结果一样??
为啥呢?

论坛徽章:
0
4 [报告]
发表于 2010-04-07 14:14 |只看该作者
.....难道 在 sub里面 “” 已经起作用啦?????

论坛徽章:
0
5 [报告]
发表于 2010-04-07 15:12 |只看该作者
貌似看出来啦
有个优先级的问题吧
发现被“”的overload发生在 被bless 之后的 reference;这就是为啥 print $x,$xx,一样的原因
还有就是 $camel >> 2
是 “”先作用还是 >> 先作用?
貌似是 >>先作用 忽略“”啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP