使用regexp将字符串拆分为数组的Perl评论错误

时间:2018-04-29 21:16:55

标签: arrays regex perl split perl-critic

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)

2 个答案:

答案 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有点极端,它会在该片段中抱怨很多其他内容。就个人而言,当我使用它时,我会在brutalperlcritic)运行harsh,并在自定义级别提供一些政策。

修改:至于您之后添加到帖子中的第三条-3邮件,它似乎已在your other post中得到解答。

答案 1 :(得分:2)

Perl Critic没有给出任何错误。它违反了政策。

要修复第一个,在循环时将循环从修饰符更改为正常并命名变量:

    while ($n =~ /
        ...

    /xg) {
        my $match = $1;
        push @array, $match;
    }

要解决第二个问题,只需将/.../更改为m{...}

在我看来,使用你不太了解的政策是没有意义的。有时,可能有很好的理由打破其中一些;盲目跟随Perl Critic(特别是在更严厉的级别)并不会带给你任何东西。