在分析期间,我在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->( $_ ) } @_;
它看起来在功能上与我相同。我是否错过了$_
这里的一些极端情况行为,较长的版本在某种程度上相当于?