[英]Using foreach instead of map and grep in perl
问题是您正在修改map
中的$_
,这意味着您正在修改传递给map
的值。 这可能会带来惊喜。 切换到for
无济于事。
在这种情况下它实际上是无害的,因为split
返回临时值,但以下是“干净”的替代方案:
my @a_columns =
map { ( my $tmp = $_ ) =~ s/^"|"$|\n|\r|\n\r|"//g; $tmp }
split /;/, $s_act_line;
use List::MoreUtils qw( apply );
my @a_columns =
apply { s/^"|"$|\n|\r|\n\r|"//g; }
split /;/, $s_act_line;
my @a_columns =
map { s/^"|"$|\n|\r|\n\r|"//rg }
split /;/, $s_act_line;
警告似乎遵循Perl::Critic (即使它似乎是由您的 IDE 发出的)。
map
以及grep
和foreach
中的变量$_
是当前处理的数组元素的别名。 所以一旦它改变了输入就会改变,这通常是不需要的,并且通常可以肯定地被认为是一种棘手的做法。 因此警告。
但在这种情况下, map
的输入是split
生成的列表,用于您的变量。 因此map
块中的代码不能直接更改您的变量。 所以告诉Perl::Ciritic
忽略这个声明是安全的
my @a_columns =
map { s/^"|"$|\n|\r|\n\r|"//g; $_ } split /;/, $s_act_line; ## no critic
或多于一份声明
## no critic
... code that Perl::Critic should ignore
## use critic
如果警告确实是由Perl::Critic
(而不是 IDE)产生的,这应该停止它。
更好的是, map
的块中使用的习语在 5.14 的 Perl 版本中不需要,因为我们得到了无损替换。 使用它s///r
返回更改后的字符串,而原始字符串保持不变。 所以你可以做
my @a_columns = map { s/^"|"$|\n|\r|\n\r|"//gr } split /;/, $s_act_line;
这也更清洁。 现在Perl::Critic
不应该标记这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.