tilly: The bug in the module is that it is not prepared to handle a sort routine that can receive 2 distinct arguments and return 0.
This problem should be resolved in Sort::External version 0.17. The $comparecode closure which you provided a band-aid for has been superseded by a private _compare() method, which should be able to handle both those sortsubs which use $Sort::External::a and $Sort::External::b and those which use positional arguments:
# Compare two elements using either standard lexical comparison or the
+ sortsub
# provided to the object's constructor.
sub _compare {
my ( $self, $item_a, $item_b ) = @_;
my $sortsub = $self->_get_sortsub;
if ( defined $sortsub ) {
local $a = $item_a;
local $b = $item_b;
return $sortsub->( $a, $b );
}
else {
return $item_a cmp $item_b;
}
}