package JustTesting;
use strict;
use warnings;
sub new {
my $self = {};
bless($self, shift);
END { $self->goodbye() };
return $self;
}
sub goodbye {
print "Goodbye.\n";
}
package main;
my $this = JustTesting->new();
Run Code Online (Sandbox Code Playgroud)
输出:
变量"$ self"不会在./test第10行保持共享.
再见.
显然它可以工作,我可以no
warnings在END块内抑制警告.但我想知道是否有更好的方法来做到这一点.
我尝试使用这样的匿名子:
my $cleanup = sub { $self->goodbye() };
END { $cleanup->() };
Run Code Online (Sandbox Code Playgroud)
然后像这样:
END { sub { $self->goodbye() }->() };
Run Code Online (Sandbox Code Playgroud)
但我总是得到同样的警告.
dax*_*xim 22
你很可能想要DESTROY而不是END.另请参阅perltoot中的析构函数部分.
package JustTesting;
use strict;
use warnings;
sub new {
my $self = {};
bless($self, shift);
return $self;
}
sub goodbye {
print "Goodbye.\n";
}
sub DESTROY {
my ($self) = @_;
$self->goodbye()
};
package main;
{
say "entering scope";
my $this = JustTesting->new();
say "leaving scope";
}
say "left scope";
Run Code Online (Sandbox Code Playgroud)
输出:
entering scope leaving scope Goodbye. left scope
仅供参考未来读者,我附上了daxim正确答案的Moose版本.
use 5.012;
use warnings;
{
package JustTesting;
use Moose;
use namespace::clean -except => 'meta';
sub goodbye { say "Goodbye." }
sub DEMOLISH {
my ($self) = @_;
$self->goodbye;
}
}
{
say "entering scope";
my $this = JustTesting->new();
say "leaving scope";
}
say "left scope";
Run Code Online (Sandbox Code Playgroud)
请注意析构函数的DEMOLISH子例程的使用.
NB.你会发现DESTROY仍然有效,但是DEMOLISH是正确的Moosey方式.
/ I3az /
| 归档时间: |
|
| 查看次数: |
1740 次 |
| 最近记录: |