【问题标题】:glob (star) operator, method disappearing, Perlglob(星号)运算符,方法消失,Perl
【发布时间】: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 如果您知道这个问题,请发布一个明确解释的答案。还要解释为什么注释掉底线可以解决问题。

标签: perl glob


【解决方案1】:

打开warnings。 Perl 会告诉你:

Subroutine set::contains redefined at ./1.pl line 44.

您使用contains 来测试元素和集合。

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多