perl tie的相关问题
package Centsible;
sub TIESCALAR { bless \my $self, shift }
sub STORE { ${ $_[0] } = $_[1] } # 做缺省的事情
sub FETCH { sprintf "%0.2f", ${ my $self = shift } } # 圆整值
package main;
tie $bucks, "Centsible";
$bucks = 45.00;
$bucks *= 1.0715; # 税
$bucks *= 1.0715; # 和双倍的税!
print "That will be $bucks, please.\n";
Centsible中STORE子程序里的 "${ $_[0] } = $_[1]",虽然注释是说做缺省,但是不大能看懂是什么意思,求解 ,以及TIESCALAR里的“bless \my $self, shift”展开写成多行应该怎么写 展开
回答您这两个问题之前, 首先您要明白 Perl 中的 reference (引用) 是怎麼写法的
假设 $self 是一个引用,
print $self;
的时候, 您就会发现那是一个引用的地址, 看上是长
Centsible=SCALAR(0x9bb32c)
这样子的.
所谓引用, 就好比 windows 上的捷径, 并不是资料的本身, 您把捷径删/改了, 并不影响资料本身的. 所以, 如果我倒想改/看到资料的本体, 那就需要做一个叫 de-reference (反引用) 的动作,
print $$self;
这时您就看到资料的实体了
回到您的问题上, TIESCALAR里的“bless \my $self, shift"..... 可以写成这样
sub TIESCALAR {
蠢轿 my $Class = shift;
#print $Class . $/; # 反注释这句, 您可以看看这句会出甚麼
bless \$self, $Class ;
#也可以写成: return bless \$self, $Class ;
#这个是 return 给 tie 的
}
这时, tie 就会得到这个 Centsible (这是一个"Class", 或叫"类") 的引用, 所以 $buck 往後的操作才能由这个 Centsible 来处理.
换一个理解方式就是, 这个 bless 了的 $self 就反回给 tie , 而 tie 之後就用个类的引用(捷径), 将一切 $buck 的变化丢到 Centsible 里处理
STORE子程序里的 "${ $_[0] } = $_[1]"....
这其实就是我上面说的de-reference(反引用), 您也可以写成这带基肆样
sub STORE {
my $self = $_[0];# 这就是值的引用(捷径)
#print $self;# 反注释这句,您又看看这会出甚麼
$$self = $_[1]; # 这里进行反引用(对值的本体进行改写)
}# 做缺省的事情
最後补充一点, 凡由引用呼叫的锋清 sub, ( 这里就是 tie 代您呼叫了 Centsible 里面的某个 sub )
其第一个参数, 即 $_[0], 就是引用的地址, 这是默认的.