Perl Can';t定位对象方法“;加上「;via package";堆;

Perl Can';t定位对象方法“;加上「;via package";堆;,perl,package,Perl,Package,我不知道为什么perl不能识别堆的add方法。获取问题标题中给出的消息。以下是最相关的文件 #!/usr/bin/perl -w use strict; use Util; use Heap; use HuffTree; my $heap = Heap->new; my $test = 3; $heap->add($test); # <--------ERROR HERE----------- 您有一个从CPAN安装的Heap.pm。这是加载的内容,而不是您自己的He

我不知道为什么perl不能识别堆的add方法。获取问题标题中给出的消息。以下是最相关的文件

#!/usr/bin/perl -w

use strict;
use Util;
use Heap;
use HuffTree;

my $heap = Heap->new;
my $test = 3;
$heap->add($test); # <--------ERROR HERE-----------



您有一个从CPAN安装的
Heap.pm
。这是加载的内容,而不是您自己的
Heap.pm
。来自CPAN的
Heap.pm
中的
new
子文件如下所示:

sub new {
    use Heap::Fibonacci;

    return &Heap::Fibonacci::new;
}
这实际上是上述模块中的一个bug,因为
Heap::Fibonacci
使用 标准
bless\$h$class事物在其
new
sub中, 因此,引用被放入
包中,该包
确实没有名为
add
的子项(
Heap::Fibonacci
有)

要解决眼前的问题,您可以:

  • 确保在“其他”
    堆之前拾取您的模块(例如,通过使用
    使用lib
    修改
    @INC
  • 或者不重新发明轮子并实际使用
    Heap::Fibonacci
无论如何,报告这个问题可能是个好主意 到
模块作者-因为即使您没有
您自己的
Heap.pm
,您的代码仍然会失败,并显示相同的消息。

您有一个从CPAN安装的
Heap.pm
。这是加载的内容,而不是您自己的
Heap.pm
。来自CPAN的
Heap.pm
中的
new
子文件如下所示:

sub new {
    use Heap::Fibonacci;

    return &Heap::Fibonacci::new;
}
这实际上是上述模块中的一个bug,因为
Heap::Fibonacci
使用 标准
bless\$h$class事物在其
new
sub中, 因此,引用被放入
包中,该包
确实没有名为
add
的子项(
Heap::Fibonacci
有)

要解决眼前的问题,您可以:

  • 确保在“其他”
    堆之前拾取您的模块(例如,通过使用
    使用lib
    修改
    @INC
  • 或者不重新发明轮子并实际使用
    Heap::Fibonacci
无论如何,报告这个问题可能是个好主意 到
模块作者-因为即使您没有
您自己的
Heap.pm
,您的代码仍然会失败,并显示相同的消息。

删除对未显示的代码的所有引用,并提供仍然引发问题的示例数据,或者我们无法为您提供太多帮助。ysth说了什么。另外,尽量简化你的程序,同时仍然显示出你的问题。@Philip Potter:如果他/她这样做了,他/她很可能会在不问问题的情况下找到答案:)在你修订的代码中,我删除了“use Thing;”、“use Util;”和“use HuffTree;”,并将
heap->new
改为
heap->new
。恐怕我无法重现有关在包
中查找
add
的任何错误消息。@floogads:仍然不足以在这里运行此代码(
HuffTree
东西
)。另外,在问题的第一个版本中,它是
Heap->new
,现在它是
Heap->new
,我认为这是一个打字错误?删除所有对未显示代码的引用,并提供仍然触发问题的示例数据,或者我们无法为您提供太多帮助。另外,尽量简化你的程序,同时仍然显示出你的问题。@Philip Potter:如果他/她这样做了,他/她很可能会在不问问题的情况下找到答案:)在你修订的代码中,我删除了“use Thing;”、“use Util;”和“use HuffTree;”,并将
heap->new
改为
heap->new
。恐怕我无法重现有关在包
中查找
add
的任何错误消息。@floogads:仍然不足以在这里运行此代码(
HuffTree
东西
)。另外,在问题的第一个版本中,它是
Heap->new
,现在它是
Heap->new
,我认为这是一个打字错误?提供的第一个解决方案应该是“如果你想重新发明轮子,给轮子命名,这样它们就不会与CPAN冲突”
Heap
应该是
ApplicationName::Heap
OrganizationName::Heap
或类似的名称:还有,谢谢!现在有道理了@重新发明轮子,我正在学习Perl,所以我只想尝试一些东西。提供的第一个解决方案应该是“如果你想重新发明轮子,给轮子命名,这样它们就不会与CPAN冲突”
Heap
应该是
ApplicationName::Heap
OrganizationName::Heap
或类似的名称:还有,谢谢!现在有道理了@重新发明轮子,我正在学习Perl,所以我只想尝试一些东西。
package Pair;

use warnings;
use strict;

sub new {
  my $class = shift;
  my $self = { @_ };
  bless $self, $class;
}


sub letter {
  my $self = shift;
  return $self->{letter};
}


sub frequency {
  my $self = shift;
  return $self->{frequency};
}


sub priority {
  my $self = shift;
  return $self->{frequency};
}

1;
package Util;

use strict;
use warnings;

sub croak { die "$0: @_: $!\n"; }


sub load_arg_file {
  my $path_name = shift @ARGV;
  my $fh;
  open($fh, $path_name) || croak "File not found.\n";
  return $fh;
}

1;
sub new {
    use Heap::Fibonacci;

    return &Heap::Fibonacci::new;
}