[英]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.