以下 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
我不明白警告,因为我认为我没有修改 $_,尽管我想我必须这样做。
有人可以向我解释一下吗?
最佳答案
您的grep
s 正在修改 $_
因为你正在使用 s//
.例如,这个:
grep {s/(^|\D)0+(\d)/$1$2/g,1}
与此相同:
grep { $_ =~ s/(^|\D)0+(\d)/$1$2/g; 1 }
我认为你最好使用
map
因为你没有用你的 grep
过滤任何东西s,你只是在使用 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/