【问题标题】:Using foreach instead of map and grep in perl在 perl 中使用 foreach 代替 map 和 grep
【发布时间】:2022-01-12 04:33:17
【问题描述】:
my @a_columns = map { s/^"|"$|\n|\r|\n\r|"//g; $_ } split /;/, $s_act_line;

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

我已经尝试了几种方法,但都不适合我。

请帮帮我

【问题讨论】:

  • 您收到什么自动警告?只要我声明了一个名为$s_act_line 的变量,我就可以很好地运行这段代码。它在use strict; use warnings; 下也可以正常运行(无论如何你都应该使用它)
  • @SilvioMayolo 听起来像是来自他们的 IDE 的 lint 警告。
  • @SilvioMayolo 我附上了警告的图片。我使用了 List 库,然后出现异常 List.pm is not available
  • 这是不理解粘贴代码的复制粘贴编程吗?一个更好的问题是:这张地图是如何工作的?

标签: regex perl


【解决方案1】:

警告似乎跟在 Perl::Critic 后面(尽管它似乎是由您的 IDE 发出的)。

map 以及grepforeach 中的变量$_ 是当前处理的数组元素的别名。所以一旦它被改变,input 数组就会改变!这通常是不需要的,并且通常可以肯定地被认为是一种棘手的做法,因此发出警告。

但在这种情况下,map 的输入是由split 生成的列表,用于您的变量。因此map 块中的代码无法通过更改$_ 来更改您的变量。那么将Perl::Ciritic告诉ignore这个语句就安全了

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 版本中不需要,因为我们得到了non-destructive substitution。有了它s///r 返回改变的字符串,保持原来的不变。所以你可以这样做

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

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

【讨论】:

    【解决方案2】:

    问题是您正在修改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;
    

    【讨论】:

    • my @a_columns = map { (my $tmp = $_) =~ s/^"|"$|\n|\r|\n\r|"//g; $tmp } split //, $s_act_line; 这对我来说实际上工作得很好.. 感谢各位支持,请原谅我直接粘贴代码,我是绝对的初学者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2018-08-21
    • 1970-01-01
    • 2020-11-02
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多