我有一个对象($ 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的对象 - 哈希表
答案 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