Podczas profilowania, natknąłem się na tej funkcji w 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 robi odwrotnego rodzaju numeryczną opartą na niektórych kluczowych orzecznika, na przykład:
my @objects = load_objects_from_database();
# sort by rating, highest first
@objects = rev_nsort_by { $_->rating } @objects;
Rozumiem doskonale dlaczego rev_nsort_by
, jak pokazano powyżej, działa zgodnie z przeznaczeniem, ale zastanawiam się, dlaczego jest tak skomplikowany. Konkretnie, zastanawiam się dlaczego
my @keys = map { local $_ = $_[$_]; scalar $keygen->($_) } 0 .. $#_;
nie został napisany jako
my @keys = map { scalar $keygen->($_) } @_;
który wygląda funkcjonalnie równoważne do mnie. Czy w tym przypadku brakuje mi jakiegoś zachowania w narożnikach z $_
, której dłuższa wersja w jakiś sposób się liczy?
Nailed go. Dzięki! –