Chinaunix

标题: 问段代码 这个sub { ${ $_[0] } } 啥意思? [打印本页]

作者: 3gtan    时间: 2010-04-07 11:40
标题: 问段代码 这个sub { ${ $_[0] } } 啥意思?
本帖最后由 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????
作者: 3gtan    时间: 2010-04-07 12:55
不能连续输入两个$$啊
code里面
my $value = $$x;

作者: 3gtan    时间: 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 的结果一样??
为啥呢?
作者: nuclearxin    时间: 2010-04-07 14:14
.....难道 在 sub里面 “” 已经起作用啦?????
作者: nuclearxin    时间: 2010-04-07 15:12
貌似看出来啦
有个优先级的问题吧
发现被“”的overload发生在 被bless 之后的 reference;这就是为啥 print $x,$xx,一样的原因
还有就是 $camel >> 2
是 “”先作用还是 >> 先作用?
貌似是 >>先作用 忽略“”啦




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2