-1
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 评论家给出以下错误。请告诉我如何解决这个问题。

在第 150 行捕获在条件之外使用的变量,
    'push @array, $1 while $n =~ /' 附近。(严重性:3)
使用 '{' 和 '}' 在第 150 行分隔多行正则表达式,
    'push @input_expression, $1 while $n =~ /' 附近。(严重性:1)
字符串*可能*需要在第 168 行进行插值,
    '$item, '$n'' 附近。(严重性:1)
4

2 回答 2

2

第一个是 IMO 误报,因为while在这里充当条件 -push @array, $1除非正则表达式匹配,否则不会执行,这是策略想要的(添加--verbose 11perlcritic调用以查看解释)。在这种情况下,我认为压制政策是安全的,如下所示。

第二个很容易修复,只需替换$n =~ /.../xg$n =~ m{...}xg.

push @array, $1  ## no critic (ProhibitCaptureWithoutTest)
    while $n =~ m{ ... }xg;

这会抑制这两条消息。

附带说明一下,IMO 严重运行perlcritic有点brutal极端,它会抱怨该片段中的许多其他内容。就个人而言,当我使用它时,我会perlcriticharsh( -3) 处运行一些自定义级别的策略。

编辑:至于您perlcritic稍后添加到帖子中的第三条消息,看起来您的其他帖子中已经回答了。

于 2018-04-29T21:37:12.870 回答
2

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

要修复第一个,请将循环从修饰符更改为普通 while 循环并命名变量:

    while ($n =~ /
        ...

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

要修复第二个,只需更改/.../m{...}.

在我看来,使用你不太了解的策略是没有意义的。有时,可能有很好的理由来打破其中的一些;盲目地追随 Perl Critic(尤其是在更严厉的水平上)不会给你带来任何东西。

于 2018-04-29T21:39:59.323 回答