sub func {
my ($n) = @_;
return unless ($n);
my @array;
push @array, $1 while $n =~ /
((?:
[^(),]+ |
( \(
(?: [^()]+ | (?2) )*
\) )
)+)
(?: ,\s* | $)
/xg;
return \@array;
}
for my $item (@array) {
if (index($item, '$n') != -1) {
print "HELLO\n";
}
}
我有以上正则表达式将一些字符串拆分为数组。它工作正常。
问题是:
Perl评论家给出了以下错误。请告知我该如何解决这个问题。
Capture variable used outside conditional at line 150, near 'push @array, $1 while $n =~ /'. (Severity: 3)
Use '{' and '}' to delimit multi-line regexps at line 150, near 'push @input_expression, $1 while $n =~ /'. (Severity: 1)
String *may* require interpolation at line 168, near '$item, '$n''. (Severity: 1)
答案 0 :(得分:2)
第一个是IMO误报,因为while
在这里充当条件 - 除非正则表达式匹配,否则push @array, $1
将不会执行,这是策略所需要的(添加{ {1}} --verbose 11
调用以查看解释)。在这种情况下,我认为可以安全地取消政策,如下所示。
第二个很容易修复,只需将perlcritic
替换为$n =~ /.../xg
。
$n =~ m{...}xg
这会抑制这两条消息。
作为旁注,在push @array, $1 ## no critic (ProhibitCaptureWithoutTest)
while $n =~ m{ ... }xg;
严重程度下perlcritic
运行时,IMO有点极端,它会在该片段中抱怨很多其他内容。就个人而言,当我使用它时,我会在brutal
(perlcritic
)运行harsh
,并在自定义级别提供一些政策。
修改:至于您之后添加到帖子中的第三条-3
邮件,它似乎已在your other post中得到解答。
答案 1 :(得分:2)
Perl Critic没有给出任何错误。它违反了政策。
要修复第一个,在循环时将循环从修饰符更改为正常并命名变量:
while ($n =~ /
...
/xg) {
my $match = $1;
push @array, $match;
}
要解决第二个问题,只需将/.../
更改为m{...}
。
在我看来,使用你不太了解的政策是没有意义的。有时,可能有很好的理由打破其中一些;盲目跟随Perl Critic(特别是在更严厉的级别)并不会带给你任何东西。