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

在这个perl代码中,$_被修改在哪里?

发布时间:2020-12-16 06:10:28 所属栏目:大数据 来源:网络整理
导读:以下perl代码在PerlCritic中生成警告(由Activestate生成): sub natural_sort { my @sorted; @sorted = grep {s/(^|D)0+(d)/$1$2/g,1} sort grep {s/(d+)/sprintf"%06.6d",$1/ge,1} @_;} 生成的警告是: Don’t modify $_ in list functions More info ab
以下perl代码在PerlCritic中生成警告(由Activestate生成):

sub natural_sort {
    my @sorted;
    @sorted = grep {s/(^|D)0+(d)/$1$2/g,1} sort grep {s/(d+)/sprintf"%06.6d",$1/ge,1} @_;
}

生成的警告是:

Don’t modify $_ in list functions

More info about that warning here

我不明白警告,因为我不认为我正在修改$_,虽然我想我一定是.
有人可以向我解释一下吗?

解决方法

你的两个greps都在修改$_,因为你正在使用s //.例如,这个:

grep {s/(^|D)0+(d)/$1$2/g,1}

与此相同:

grep { $_ =~ s/(^|D)0+(d)/$1$2/g; 1 }

我认为你最好不要使用map,因为你没有用greps过滤任何东西,你只是使用grep作为迭代器:

sub natural_sort {
    my $t;
    return map { ($t = $_) =~ s/(^|D)0+(d)/$1$2/g; $t }
           sort
           map { ($t = $_) =~ s/(d+)/sprintf"%06.6d",$1/ge; $t }
           @_;
}

这应该做同样的事情,让评论家保持沉默.如果你想要一些比普通地图更好的列表操作符,你可能想看看List::MoreUtils.

(编辑:李大同)

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

    推荐文章
      热点阅读