在这个perl代码中,$_被修改在哪里?
发布时间:2020-12-16 06:10:28 所属栏目:大数据 来源:网络整理
导读:以下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 ab
以下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 我不明白警告,因为我不认为我正在修改$_,虽然我想我一定是. 解决方法
你的两个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 } @_; } 这应该做同样的事情,让评论家保持沉默.如果你想要一些比普通地图更好的列表操作符,你可能想看看 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |