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

问题是:Perl 评论家给出了以下违反政策的规定。

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

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

4

1 回答 1

3

在这种情况下,分析器要么发现错误,要么在标记您的代码时完全错误。

您是在寻找文字“ $n ” in $item,还是寻找什么$n变量的计算结果?

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

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

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

    如果确实如此,但$n也可能包含您需要作为文字字符的其他转义序列或编码(以便抑制它们的评估),那么您可能需要做更多的事情,具体取决于该变量中的确切内容。

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

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

如果您将单引号或 q// 与包含可能需要插值的未转义元字符的字符串一起使用,此策略会警告您。

为了满足策略,您需要使用双引号并转义$. qq(\$n)在我看来,这会将精细的原始代码段变成奇怪的东西。

如果您最终只想让警告静音,请参阅弯曲规则中的文档

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

它所依据的书在介绍中很好地说明了这一切。合理使用。


当我查看这个问题的来源时,您似乎正在寻找匹配子字符串的索引,因此您需要$n变量的内容,而不是文字“ $n ”。然后perlcritic发现代码中的一个错误,使用它的好回报!

于 2018-04-29T23:55:05.463 回答