在Perl中使用foreach而不是map和grep

fslejnso  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(158)
my @a_columns = map { s/^"|"$|\n|\r|\n\r|"//g; $_ } split /;/, $s_act_line;

上面提到的是我的代码。我得到自动警告,而合并此代码,因为使用Map函数。请帮助我转换这使用或foreach或任何循环。
我已经尝试了几种方法,但没有一种对我有效。
请帮帮我伙计们

vbopmzt1

vbopmzt11#

该警告显示在Perl::Critic之后(即使它似乎是由IDE发出的)。
map中的变量$_,以及grepforeach中的变量$_,是当前处理的数组元素的别名。因此,一旦它被更改,input 数组也会被更改!这通常是不需要的,并且通常可以肯定地被认为是一种棘手的做法,因此发出了警告。
但是在本例中,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的块中使用的习惯用法在Perl 5.14以后的版本中是不需要的,因为我们得到了非破坏性的替换。使用它,s///r * 返回 * 改变的字符串,而保持原始字符串不变。所以你可以

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

这也更加干净和安全。现在Perl::Critic不应该标记这个。

watbbzwu

watbbzwu2#

问题是你正在map中修改$_,这意味着你正在修改传递给map的值。这可能会导致意外。切换到for不会有帮助。
在这种情况下,它实际上是无害的,因为split返回临时值,但以下是“干净”的替代方法:
第一个

相关问题