Во время профилирования я наткнулся на эту функцию в List:: UtilsBy:
sub rev_nsort_by(&@) {
my $keygen = shift;
my @keys = map { local $_ = $_[$_]; scalar $keygen->( $_ ) } 0 .. $#_;
return map { $_[$_] } sort { $keys[$b] <=> $keys[$a] } 0 .. $#_;
}
rev_nsort_by выполняет обратную численную сортировку на основе некоторого ключевого предиката, например:
my @objects = load_objects_from_database();
# sort by rating, highest first
@objects = rev_nsort_by { $_->rating } @objects;
Я прекрасно понимаю, почему rev_nsort_by
, как показано выше, работает по назначению, но мне интересно, почему это так сложно. В частности, мне интересно, почему
my @keys = map { local $_ = $_[$_]; scalar $keygen->( $_ ) } 0 .. $#_;
не был записан как
my @keys = map { scalar $keygen->( $_ ) } @_;
который выглядит функционально эквивалентным мне. Я пропустил какое-то поведение в области углов в случае $_
здесь, которое более длинная версия имеет значение в некотором роде?