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

标签 perl natural-sort perl-critic

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

相关文章:

sorting - 如何使用自然排序顺序对 solr 中的文本/字符串进行排序?

perl - 如何并行运行 Test::Perl::Critic?

perl - 为什么 'opendir' 与 Perl Best Practices 中的 'open' 没有相同的策略?

regex - 如何安全地使用用户输入中的正则表达式?

html - 使用 perl 脚本从 HTML 文件中提取信息

perl - CSV 数据中的换行符 Text::CSV reading

sql - MySQL 中的自然排序

mysql - 对表进行排序,在 MySQL 中使用带有 SELECT 和 UPDATE 的循环以及 NATURAL ORDER

c - 在 C 中操作字符串 Perl SV

perl - 为什么我应该在 Perl 中使用 <ARGV> 或 <> 而不是 <STDIN> ?