我对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;
}
答案 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。我知道这本身并没有回答这个问题,而是提出了另一种解决方案。