在检查字符串中子字符串的索引时,Perl批评策略违规

时间:2018-04-29 22:49:38

标签: string perl substring perl-critic

for my $item (@array) {
    if (index($item, '$n') != -1) {
       print "HELLO\n";
    }
} 

问题是:Perl评论家给出了以下政策违规行为。

  

字符串可能需要在第168行插值,接近'$ item,'$ n''。 (严重程度:1)

请告知我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

在这种情况下,分析器会发现错误或标记代码时出现明显错误。

您是否正在寻找文字" $ n "在$item中,或$n变量评估为什么?

  • 如果您想找到文字 $ n 字符,那么您的代码没有任何问题

  • 如果您希望$item包含$n变量中存储的值,则允许对其进行评估,

    if (index($item, $n)  != -1)
    

    如果情况确实如此,但$n可能还包含其他需要作为文字字符的转义序列或编码(因此要抑制其评估),那么您可能需要做更多的事情,具体取决于什么确切地说可能在那个变量中。

如果您确实需要查找字符$后跟n(这可以解释在变量周围放置单引号的故意行为),您需要处理警告。

对于违反的特定政策,请参阅Perl::Critic::Policy::ValuesAndExpressions

  

如果您使用单引号或q //使用具有可能需要插值的未转义元字符的字符串,则此策略会发出警告。

要满足该政策,您需要使用双引号并转义$,例如qq(\$n)。在我看来,这会将优秀的原始代码段改变成一些奇怪的东西。

如果您最终希望简单地将警告静音,请参阅Bending The Rules

中的文档

评论。 工具 perlcritic很有用,但您必须正确使用它。它是一个静态代码分析器,它不知道你的程序正在做什么,所以说;它可以捕获不良做法,但不能告诉你如何编写程序。它的许多政策"不适合特定代码。

book that it is based on在介绍中非常好地说明了这一切。合理使用。

当我查看question来自哪里时,您似乎正在寻找匹配子字符串的索引,因此您需要$n变量的内容,而不是文字" $ N &#34 ;.然后perlcritic识别出代码中的错误,使用它的好回报!