首页 > 解决方案 > 使用正则表达式将字符串拆分为数组时的 Perl 评论家错误

问题描述

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)

标签: arraysregexperlsplitperl-critic

解决方案


第一个是 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稍后添加到帖子中的第三条消息,看起来您的其他帖子中已经回答了。


推荐阅读