perl tie的相关问题

#!/usr/bin/perlpackageCentsible;subTIESCALAR{bless\my$self,shift}subSTORE{${$_[0]}=$_... #! /usr/bin/perl
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”展开写成多行应该怎么写
展开
 我来答
百度网友c9e795dda
推荐于2016-05-17 · TA获得超过5167个赞
知道大有可为答主
回答量:1128
采纳率:0%
帮助的人:1141万
展开全部

回答您这两个问题之前, 首先您要明白 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], 就是引用的地址, 这是默认的.

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式