Perl 使用Rose::HTML::Form时如何覆盖比较_字段

Perl 使用Rose::HTML::Form时如何覆盖比较_字段,perl,Perl,因此,我正在尝试使用,我希望我的字段基于“排名”而不是名称(默认值)显示 我已经编写了一个比较器子程序: sub _order_by_rank { my ($self, $one, $two) = @_; return $one->rank <=> $two->rank; }; 但我只剩下: Can't call method "name" on unblessed reference at /usr/lib/perl5/site_perl/5.8.8/Rose

因此,我正在尝试使用,我希望我的字段基于“排名”而不是名称(默认值)显示

我已经编写了一个比较器子程序:

sub _order_by_rank {
  my ($self, $one, $two) = @_;
  return $one->rank <=> $two->rank;
};
但我只剩下:

Can't call method "name" on unblessed reference at /usr/lib/perl5/site_perl/5.8.8/Rose/HTML/Form/Field/Collection.pm line 405.
在我添加任何东西之前,它似乎调用了比较器

构造表单对象后,我添加了一些字段,然后调用init_字段:

$form->add_fields(
    id => { type => 'hidden', value => "", rank => 0 },
    number => { type => 'int', size => 4, required => 1, label => 'Plant Number', rank => 1 },
    name => { type => 'text', size => 25, required => 1, label => 'Plant Name', rank => 2 },
    ...
  );
$form->init_fields;
根据文档,这是人们通常做的事情。它没有解释的是怎么做


希望在我买新键盘之前,有人能给我解释一下:)从文档中看,似乎不是传递一个子程序引用,而是需要子类化
Rose::HTML::Form
并重写
compare\u fields
方法

默认的比较方法是
Rose::HTML::Form::compare\u fields
。如果您想要对不同的表单使用不同的排序方法,那么必须创建子类


如果您显示完整的代码,这将有助于我进一步解释。

这是您的实际代码吗<代码>\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\。而且,非常正确-看起来我在复制粘贴时一定按了什么。谢谢:)@PaulRohrlach:不客气。显然,您知道如何编写子类和重写继承的方法。我也准备好解释那部分了!
$form->add_fields(
    id => { type => 'hidden', value => "", rank => 0 },
    number => { type => 'int', size => 4, required => 1, label => 'Plant Number', rank => 1 },
    name => { type => 'text', size => 25, required => 1, label => 'Plant Name', rank => 2 },
    ...
  );
$form->init_fields;