【发布时间】:2014-04-30 13:01:27
【问题描述】:
我有一个模块在 /path/to/set.pm 第 121 行给出错误“无法通过包“a”定位对象方法“isSubset”(也许您忘记加载“a”?) .
SET.PM:
package set; #we will create set objects, instead of treating arrays as sets
sub new{
my $packagename = shift;
my @elements = @_;
bless { 'elements' => \@elements } => $packagename;
}
sub contains{
my $set = shift;
my ($element) = @_;
foreach ($set->elements){ if( $_ eq $element ){ return 1 } }
return 0
}
sub isElement{
my ($element,$set) = @_;
return $set->contains($element)
}
sub isSubset{
my $setA = shift;
my $setB = shift;
foreach ($setA->elements){ unless( isElement($_,$setB) ){ return 0 } }
return 1
}
*subset = *isContainedIn = *isContained = \&isSubset;
sub isSuperset{
my $setA = shift;
my $setB = shift;
return $setB->isSubset($setA) # this is line 121
}
*superset = *isContaining = *contains = \&isSuperset; # when i get rid of THIS line, it works fine.
当我注释掉最后一行时,它工作正常。您能告诉我导致失败的原因吗?我是否错误地使用了 glob?
调用程序:
my $a = set->new('a'..'g');
my $b = set->new('b'..'f');
print $a->isSubset($b);
【问题讨论】:
-
变量 $setB 的值为“a”。您的示例代码未显示您如何调用 sub,因此我们无法进一步帮助您。
-
变量 $setB 没有值“a”,调用程序准确地显示了我如何调用 sub。如果您确定自己是正确的,请提供更多解释。
-
@choroba $a,变成 $setA,值为 'a'
-
好的,现在你打电话给
'a'->isSubset()。由于'a'不是一个对象,它被解释为一个类名。因此出现错误。 -
@choroba 如果您知道这个问题,请发布一个明确解释的答案。还要解释为什么注释掉底线可以解决问题。