作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在分析过程中,我在 List::UtilsBy 中遇到了这个函数。 :
sub rev_nsort_by(&@) {
my $keygen = shift;
my @keys = map { local $_ = $_[$_]; scalar $keygen->( $_ ) } 0 .. $#_;
return map { $_[$_] } sort { $keys[$b] <=> $keys[$a] } 0 .. $#_;
}
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->( $_ ) } @_;
$_
的一些极端行为?在这里,哪个较长的版本在某种程度上相当于?
最佳答案
这里有一个微妙的边缘情况:Inside foreach
循环,或 map
表达式,默认变量 $_
别名为原始值。例如
@nums = 1..5;
@foo = map { $_ *= 2 } @nums;
# both @foo and @nums contain 2, 4, 6, 8, 10 now.
@foo = map { $_ *= 2 } 1, 2, 3, 4, 5;
# Modification of read-only value
@_
数组也是原始值的别名,因此请想象以下边缘情况:
sub buggy (&@) { my $cb = shift; map $cb->($_), @_ };
buggy { $_ *= 2 } 1, 2, 3; # Modification of read-only value attempted
buggy { $_[0] *= 2} 1, 2, 3; # ditto
my @array = 1 .. 5;
buggy { $_ *= 2 } @array; # @array now is 2, 4, 6, 8, 10
buggy { $_[0] *= 2 } @array; # ditto
$_[0]
别名为
$_
,别名为外部
$_[0]
,这是常量
1
的别名/
$array[0]
.
local $_ = $_[$_]
是什么意思?在这里做什么?
$_
的意图回调可见。 map {local $_ = $_; ...} @_
足以制作副本)
关于perl - 我在这里错过了 $_ 的一些语义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316514/
我无法在附加行中显示“真”、“假”、"is"和“否”按钮。 我在这里有一个应用程序:Application 请按照以下步骤使用应用程序: 1。当你打开应用程序时,你会看到一个绿色的加号按钮,点击 在此
我是一名优秀的程序员,十分优秀!