访问对象中的对象? (Perl的)

时间:2011-10-11 03:17:50

标签: perl

我对perl很新。我有一个SomeItem对象,其中包含一个InnerObject数组,我想在其中调用“foo”方法。

foreach $obj (@ { $self->{InnerObjects} }) {
   $obj->foo();
}

这不起作用。这是我得到的错误:

如果没有包或对象引用,则无法调用方法“foo”

InnerObject类与SomeItem位于同一个文件中,如果可能的话,我希望保持这种方式,那么如何从SomeItem类/包中访问InnerObject类/包?

以下是我在构造函数中声明数组的方法:

$self->{InnerObjects} = [];

并设置它:

sub set {
   my ($self, @items) = @_;
   @{ $self->{InnerObjects} } = @items;
}

2 个答案:

答案 0 :(得分:0)

到目前为止,您的代码看起来合法。因此,错误可能在传递给set()的数据中。

请添加以下内容以设置代码:

sub set {
   my ($self, @items) = @_;
   @{ $self->{InnerObjects} } = @items;
   print "OBJECT To work on: " . ref($self) . "\n";
   print "TOTAL objects passed: " . scalar(@items) . "\n";
   foreach my $obj (@items) { print "REF: " . ref($obj) . "\n" };
}

这将显示您传递的对象数量以及它们是否确实是正确类的对象(ref应该打印类名称)

此外,请注意@{ $self->{InnerObjects} } = @items; 复制对象引用数组,而不是将引用存储到原始数组@items - 这不是原因你的问题根本导致你基本上分配2个数组而不是一个。除非数组非常大,否则内存管理不是一个主要问题,但仍然是浪费的(@items数组完成后需要对set()数组进行垃圾回收。

我为将基本上是评论内容的内容作为答案而道歉,但它太大而无法发表评论。

答案 1 :(得分:0)

我对该问题的解决方案最终创建了一个哈希,其中包含SomeItem的ID,该ID指向InnerObjects数组的引用。这个哈希是由类操作类创建的,

%SomeItemInnerObjects;     # Hash of SomeItem IDs=>InnerObject array references
$SomeItemInnerObjects{ $currentSomeItem->{ID} } = \@myInnerObjects;

并按如下方式使用:

foreach $item (@{ $SomeItemInnerObjects{$currentSomeItem->{ID} } }) {
    # item is an InnerObject 
    $item->foo($currentSomeItem->{ID});
}

所以SomeItem不再包含InnerObjects。我知道这本身并没有回答这个问题,而是提出了另一种解决方案。