簡體   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