【发布时间】:2015-11-13 02:08:58
【问题描述】:
我有一个 Perl 脚本生成一组对对象的弱引用。一旦这些对象之一超出范围,数组中对它的引用将变为未定义。
ex(伪代码):
# Imagine an array of weak references to objects
my @array = ( $obj1_ref, $obj2_ref, $obj3_ref );
# Some other code here causes the last strong reference
# of $obj2_ref to go out of scope.
# We now have the following array
@array = ( $obj1_ref, undef, $obj3_ref )
有没有办法让未定义的引用在未定义后自动从数组中删除?
我想要@array = ($obj1_red, $obj3_ref )。
编辑:
我尝试了这个解决方案,但它不起作用:
#!/usr/bin/perl
use strict;
use warnings;
{
package Object;
sub new { my $class = shift; bless({ @_ }, $class) }
}
{
use Scalar::Util qw(weaken);
use Data::Dumper;
my $object = Object->new();
my $array;
$array = sub { \@_ }->( grep defined, @$array );
{
my $object = Object->new();
@$array = ('test1', $object, 'test3');
weaken($array->[1]);
print Dumper($array);
}
print Dumper($array);
输出:
$VAR1 = [
'test1',
bless( {}, 'Object' ),
'test3'
];
$VAR1 = [
'test1',
undef,
'test3'
];
undef 不会自动从数组中删除。
我错过了什么吗?
编辑 2:
我还尝试在对象的 DESTROY 方法中从数组中删除未定义的值,但这似乎也不起作用。看来,由于该对象在技术上仍未“销毁”,因此仍会定义弱引用,直到 DESTROY 方法完成...
【问题讨论】:
-
你的意思是
my @array = ( ... )还是my $array = [ ... ]? -
我的意思是
(),我会更正它。抱歉,这只是一些快速编写的伪代码,更多的是为了理解这一点而不是语法正确。 -
速写伪答案:清除对象析构函数中的列表。或者,使用一个对象而不是数组,它会在任何需要它的操作之前自行清理。
-
您应该将其发布为真正的答案,析构函数方法听起来是个好主意。销毁对象后,我可以(可能)从数组中删除所有未定义的值。 :)
-
关于“弱引用仍然被定义,直到 DESTROY 方法完成......”,np。搜索您对自己的引用而不是 undef。
标签: arrays perl oop weak-references