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

10-15 19:57