我不确定为什么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)
您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(修改@INC用use lib,例如:Heap::Fibonacci).无论如何,向Heap模块作者报告此问题可能是一个好主意- 因为即使您没有自己的问题Heap.pm,您的代码仍然会失败并显示相同的消息.
| 归档时间: |
|
| 查看次数: |
1100 次 |
| 最近记录: |