在对象中排序

时间:2015-02-16 23:17:39

标签: perl hash

我有一个对象($ p),在初始化中我有$this->{list} = [];

稍后,我用另一个类(q)的对象填充数组,并可以在类[p]中的另一个子例程中以@{$self{list}}的形式访问它们。我正在尝试对此数组进行排序,如

my @slist = sort $self->point_sort, @{$self->{list}};

point_sort被定义为类p中的子例程,我正在

Can't call method "getQval" on an undefined value at p.pm line 64

getQval是在对象q中定义的子例程,其实例填充{list}。我正在努力

my $v1 = $a->getQval;
my $v2 = $b->getQval;
子程序point_sort中的

。有什么建议? TIA。

编辑: 将呼叫更改为

my @slist = sort { $self->point_sort ($a,$b) } @{$self->{list}};

在point_sort中,我现在有

my ($c, $d) = @_;
my $val1 = $c->getVarVal;

错误:

Can't locate object method "getVarVal" via package "packageP" at ...

我认为它与包有关,不确定它是什么。它正在查看包p,而我希望它看看包q。

编辑: 我在print上面做过$c - perl认为它是类p的对象 - 哈希表

2 个答案:

答案 0 :(得分:2)

您实际上并未在此处使用$self->point_sort作为比较功能。它立即被调用(没有参数,在$a$b之前设置,因此错误)及其返回值(如果它到达那么远)然后将用作比较器。

最简单的解决方法是明确传递$a$b

my @slist = sort { $self->point_sort($a, $b) } @{$self->{list}};

然后在point_sort中将它们作为常规参数接收。

答案 1 :(得分:1)

sort的语法是:

sort SUBNAME LIST   # Sort the list using named function as the comparison function
sort BLOCK LIST     # Sort the list using the block as the comparison function
sort LIST           # Sort the list using the default comparison function.

您希望将$self->point_sort用作比较函数,但您使用的是第三种语法,而不是允许您指定比较函数的两种语法之一。

也许你想要

sort { $self->point_sort($a, $b) } @{ $self->{list} }

很明显n