繁体   English   中英

在 perl 中使用 foreach 代替 map 和 grep

[英]Using foreach instead of map and grep in perl

my @a_columns = map { s/^"|"$|\n|\r|\n\r|"//g; $_ } split /;/, $s_act_line;

上面提到的是我的代码。 由于使用了 map function,我在合并此代码时收到自动警告。 请帮助我使用 for 或 foreach 或任何循环来转换它。

我已经尝试了几种方法,但对我没有任何作用。

请帮帮我

在此处输入图像描述

问题是您正在修改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以及grepforeach中的变量$_是当前处理的数组元素的别名。 所以一旦它改变了输入就会改变,这通常是不需要的,并且通常可以肯定地被认为是一种棘手的做法。 因此警告。

但在这种情况下, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM