无法通过包"Heap"找到对象方法"add"

flo*_*ads 0 perl package

我不确定为什么perl没有认识到Heap的方法添加.获得问题标题中的消息.这是最相关的文件.

#!/usr/bin/perl -w

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

my $heap = Heap->new;
my $test = 3;
$heap->add($test); # <--------ERROR HERE-----------
Run Code Online (Sandbox Code Playgroud)
package Heap;

use strict;
use warnings;

use POSIX ();

sub new {
  my $class = shift;
  my $self = { "aref" => [""],
           "next" => 1,
           @_};
  bless $self, $class;
}


sub print {
  my $self = shift;
  my $next = $self->{"next"};
  my $aref = $self->{"aref"};
  print "array => @$aref\n";
  print "next => $next\n";
}


sub compare {
  my ($self, $i, $j) = @_;
  my $x = $self->{"aref"}[$i];
  my $y = $self->{"aref"}[$j];

  if (!defined $x) {
    if (!defined $y) {
      return 0;
    } else {
      return -1;
    }
  }
  return 1 if !defined $y;
  return $x->priority <=> $y->priority;
}


sub swap {
  my ($self, $i, $j) = @_;
  my $aref = $self->{"aref"};
  ($aref->[$i], $aref->[$j]) = ($aref->[$j], $aref->[$i]);
}


sub add {
  my ($self, $value) = @_;
  my $i = $self->{"next"};
  $self->{"aref"}[$i] = $value;

  while ($i > 1) {
    my $parent = POSIX::floor($i/2);
    last if $self->compare($i, $parent) <= 0;
    $self->swap($i, $parent);
    $i = $parent;
  }
  $self->{"next"}++;
}


sub reheapify {
  my ($self, $i) = @_;
  my $left = 2 * $i;
  my $right = 2 * $i + 1;

  my $winleft = $self->compare($i, $left) >= 0;
  my $winright = $self->compare($i, $right) >= 0;
  return if $winleft and $winright;

  if ($self->compare ($left, $right) > 0) {
    $self->swap($i, $left);
    $self->reheapify($left);
  } else {
    $self->swap($i, $right);
    $self->reheapify($right);
  }
}


sub remove {
  my $self = shift;
  my $aref = $self->{"aref"};

  my $result = $aref->[1];
  $aref->[1] = pop @$aref;
  $self->{"next"}--;

  $self->reheapify(1);
  return $result;
}


sub empty {
  my $self = shift;
  return $self->{"next"} == 1;
}

1;
Run Code Online (Sandbox Code Playgroud)
package HuffTree;

    use warnings;
    use strict;

use Pair;
our @ISA = "Pair";


sub priority {
  my $self = shift;

  # lowest count highest priority
  return -$self->{frequency}; 
}


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


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

1;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)

Grr*_*rrr 5

Heap.pm已从CPAN安装.这是加载的,而不是你自己的Heap.pm.来自CPAN 的newsub Heap.pm看起来像这样:

sub new {
    use Heap::Fibonacci;

    return &Heap::Fibonacci::new;
}
Run Code Online (Sandbox Code Playgroud)

这实际上是所述模块中的一个错误,因为在其sub中Heap::Fibonacci使用标准的bless \$h, $class;东西new,所以引用被祝福到Heap包中,它确实没有一个名为add(Heap::Fibonaccido)的子包.

要解决您的紧急问题,您可以:

  • 确保你的模块拿起之前的"其他" Heap(修改@INCuse lib,例如:
  • 或者不重新发明轮子并实际使用Heap::Fibonacci).

无论如何,向Heap模块作者报告此问题可能是一个好主意- 因为即使您没有自己的问题Heap.pm,您的代码仍然会失败并显示相同的消息.

  • 提供的第一个解决方案应该是"如果你想重新发明轮子,命名你的轮子,这样它们就不会与CPAN发生冲突".`堆`应该是`ApplicationName :: Heap`或`OrganizationName :: Heap`或类似的东西.:) (5认同)
  • 另请参阅[关于私有模块名称的问题](http://stackoverflow.com/questions/658955/how-do-i-choose-a-package-name-for-a-custom-perl-module-that-does -not-碰撞). (3认同)