以下 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} @_;
}
生成的警告是:
More info about that warning here
我不明白警告,因为我认为我没有修改 $_,尽管我想我必须这样做。
有人可以向我解释一下吗?
最佳答案
您的两个 grep
都在修改 $_
,因为您正在使用 s//
。例如,这个:
grep {s/(^|\D)0+(\d)/$1$2/g,1}
与此相同:
grep { $_ =~ s/(^|\D)0+(\d)/$1$2/g; 1 }
我认为您最好使用
map
,因为您没有使用 grep
过滤任何内容,您只是将 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
更好的列表运算符,您可能想看看 map
。关于perl - 这个 perl 代码在哪里修改了 $_?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5894332/