*print '[', $self->name, " is being destroyed...]\n";
*
猜你的本意是:

* print '[', ref $self, " is being destroyed...]\n";

改成如上这样就OK了,这是因为 $self 此时是 Barn, 没有 name 这个方法,直接就异常退出了。*



2010/4/8 andy white <[email protected]>

> { package Animal;
> sub name {
> my $either = shift;
>  ref $either
> ? $either->{Name}
> : "an unnamed $either";
>  }
> sub named {
> my $class = shift;
>  my $name = shift;
> my $self = { Name => $name, Color => $class->default_color };
>  bless $self, $class;
> }
>
> sub default_color { 'brown' }
>  sub DESTROY {
> my $self = shift;
> print '[', $self->name, " has died.]\n";
>  }
> }
> { package Cow;
> @ISA = qw( Animal );
> }
> { package Barn;
> sub new { bless [ ], shift }
> sub add { push @{+shift}, shift }
>  sub contents { @{+shift} }
> sub DESTROY {
> my $self = shift;
>  print '[', $self->name, " is being destroyed...]\n";
> for($self->contents) {
>  print ' ', $_->name, " goes homeless.\n";
> }
> }
> }
>
> my $barn = Barn->new;
> $barn->add(Cow->named('Bessie'));
> $barn->add(Cow->named('Gwen'));
> print "Burn the barn:\n";
> $barn = undef;
> print "End of program.\n";
>
> 现在的程序的运行结果的是:
> Burn the barn:
> [Gwen has died.]
> [Bessie has died.]
> End of program.
>
> 当$barn = undef时,调用的是Animal的DESTROY方法。
>
> 我想要的结果是还要调用Barn的DESTROY方法(并且打印contents的内容),即
> Burn the barn:
> Barn=ARRAY(0x541c) is being destroyed...
>   Bessie goes homeless.
>   Gwen goes homeless.
> [Gwen has died.]
> [Bessie has died.]
> End of program.
>
> 问题出在那里阿?那位帮忙看看吧!
>
> --
> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。
> 要取消订阅此网上论坛,请发送电子邮件至 
> [email protected]<perlchina%[email protected]>
> 。
> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
>

-- 
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 [email protected]。
要取消订阅此网上论坛,请发送电子邮件至 [email protected]。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

回复