【发布时间】:2015-08-05 19:43:53
【问题描述】:
我正在编写一个从不断变化的外部源获取数据的 Perl 脚本。当从这个外部源添加或删除数据时,我希望我的 Perl 脚本中的数据结构能够反映这些更改。我可以通过创建以类似方式存储数据的对象并在尝试访问我的 Perl 脚本中的数据时同步这些对象中的数据来做到这一点。
这很好用,并且可以获取添加到此外部源的任何新数据;但是,当删除任何数据时会出现问题。如果删除了任何数据,我希望我的 Perl 脚本中对它的所有现有引用也被销毁,这样用户就不能再尝试访问数据而不会引发错误。
我能想到的唯一方法是在确定数据不再存在后立即取消定义对数据的内部引用。然而,它似乎;当引用未定义时,它不会删除存储在引用位置的数据,它只会删除保存引用的变量中的数据。
这是一个演示我的问题的测试脚本:
#!/usr/bin/perl
# Always use these
use strict;
use warnings;
####################################################################################################
# Package to create an object
package Object;
use Moose;
# Define attributes
has 'name' => (is => 'ro', isa => 'Str', required => 1);
####################################################################################################
# Package to test with
package test;
# Create an object
my $object1 = Object->new('name' => 'Test Object');
print 'OBJECT1 NAME: '.$object1->name()."\n";
# Create another reference to the object
my $object2 = $object1;
# Print the name
print 'OBJECT2 NAME: '.$object2->name()."\n";
# Print both references
print "\n";
print "OBJ : $object1\n";
print "OBJ2 : $object2\n";
print "\n";
# Undefine the reference to object2
undef $object2;
# Try to print both names
print 'OBJECT1 NAME: '.$object1->name()."\n";
print 'OBJECT2 NAME: '.$object2->name()."\n";
我怎样才能完全销毁一个对象的所有痕迹,以便任何访问它的数据的尝试都会导致错误?
编辑:
这是一个不同的例子,可以更好地解释我想要实现的目标。
假设我有一个文件对象:
my $file = File->new();
现在我想获取该文件中的文本
my $text = $file->text();
现在我又得到了它(出于某种未知原因)
my $text2 = $file->text();
我希望能够修改$text 并让它直接影响$text2 的内容以及更改文件的实际text 属性。
我基本上是在尝试将变量联系在一起,所以如果一个变量发生变化,它们都会发生变化。此外,如果一个被删除,它们将全部被删除。
这也意味着如果 text 属性发生更改,$text1 和 $text2 也会随之更改以反映新值。
这可以使用某种别名来完成吗?
【问题讨论】:
-
所以你想让
$object1在你输入undef $object2之后变成undef? -
是的,这就是我要找的。span>
-
是的,我首先看了一下,它告诉您如何执行 undef,但不是如何摆脱它的每个实例。
-
您是否真的需要从内存中物理擦除对象,或者您是否可以简单地向对象添加像
is_deleted这样的字段?这样每次您尝试访问该对象时,您都可以检查它是否仍然有效。
标签: perl oop reference destroy