以下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
.