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

前端之家收集整理的这篇文章主要介绍了在这个perl代码中,$_被修改在哪里?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
以下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.

猜你在找的Perl相关文章