加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 我在这里缺少一些$_的语义?

发布时间:2020-12-15 21:33:24 所属栏目:大数据 来源:网络整理
导读:在剖析期间,我在 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基
在剖析期间,我在 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->( $_ ) } @_;

看起来功能上与我相当.我错过了$_这里的一些角色行为,其中较长的版本以某种方式支付?

解决方法

这里有一个微妙的边缘案例:内部foreach循环或映射表达式,默认变量$_别名为原始值.例如.
@nums = 1..5;
@foo = map { $_ *= 2 } @nums;
# both @foo and @nums contain 2,4,6,8,10 now.

然而,常量不是有效的左值,所以我们不能这样做

@foo = map { $_ *= 2 } 1,2,3,5;
# Modification of read-only value

@_数组也被别名为原始值,因此可以想象以下边缘情况:

sub buggy (&@) { my $cb = shift; map $cb->($_),@_ };

buggy { $_ *= 2 } 1,3;   # Modification of read-only value attempted
buggy { $_[0] *= 2} 1,3; # ditto

my @array = 1 .. 5;
buggy { $_ *= 2 } @array;    # @array now is 2,10
buggy { $_[0] *= 2 } @array; # ditto

别名是可传递的,所以内部$_ [0]被别名为$_,它被别名为外部$_ [0],它是常量1 / $数组[0]的别名.

那么,本地$_ = $_ [$_]在这里呢?

>它创建一个值的副本,从而避免这种疯狂的混叠行为
>它显示了让$_对回调可见的意图.

确保复制语义(从而避免意外的副作用)对于Perl来说是很自然的,所以这个功能是精心设计的,而不是特别的强化.

(注意:地图{local $_ = $_; …} @_将足以制作副本)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读