我尝试在Object中使用(类)方法来排序对象实例。
package Something;
use strict;
use warnings;
use Data::Dumper;
sub new {
my ($class, $date) = @_;
my $self = bless{}, $class;
$self->{date} = $date;
return $self;
}
sub _sort($$) {
print STDERR Dumper($_[0], $_[1]);
$_[0]->{date} cmp $_[1]->{date};
}
package SomethingTest;
use base 'Test::Class';
use Test::More;
__PACKAGE__->runtests() unless caller;
sub sorting : Test {
my $jan = Something->new("2016-01-01");
my $feb = Something->new("2016-02-01");
my $mar = Something->new("2016-03-01");
is_deeply(
sort Something::_sort [$feb, $mar, $jan],
[$jan, $feb, $mar]);
}
我在perldoc -f sort
中看到了这个代码段,因此是_sort
的原型。
# using a prototype allows you to use any comparison subroutine
# as a sort subroutine (including other package's subroutines)
package other;
sub backwards ($$) { $_[1] cmp $_[0]; } # $a and $b are
# not set here
package main;
@new = sort other::backwards @old;
但是,转储的参数看起来很奇怪:
$VAR1 = [
bless( {
'date' => '2016-02-01'
}, 'Something' ),
bless( {
'date' => '2016-03-01'
}, 'Something' ),
bless( {
'date' => '2016-01-01'
}, 'Something' )
];
$VAR2 = [
$VAR1->[2],
$VAR1->[0],
$VAR1->[1]
];
,测试失败,
# Failed test 'sorting died (Not a HASH reference at sort.t line 16.)'
# at sort.t line 25.
这只是我的测试设置还是不能在这些数组中拥有相同的对象? 我还缺少什么?
答案 0 :(得分:6)
您的问题不是传递给sort()
的子程序,而是传递给is_deeply()
的参数。如果我们添加一些括号,你写它的方式会像这样解析:
is_deeply(
sort(Something::_sort [$feb, $mar, $jan], [$jan, $feb, $mar] )
);
也就是说,您告诉sort()
对包含两个匿名数组引用的列表执行操作,然后使用从is_deeply()
返回的单个参数运行sort
(除了它is_deeply()
之前崩溃可以试图运行并抱怨你给它的参数太少而无法使用)。
这可能更接近你的意图:
is_deeply(
[sort(Something::_sort ($feb, $mar, $jan))],
[$jan, $feb, $mar]);
也就是说,告诉is_deeply()
比较两个匿名数组,第一个是通过告诉sort()
将您的排序例程应用到列表($feb, $mar, $jan)
。