在void上下文中无用的使用数字lt(<)

时间:2015-09-25 09:22:15

标签: perl

我很抱歉这个可能很愚蠢的问题,但我收到以下警告:

"Useless use of numeric lt (<) in void context"

运行此代码时:

   for (my $j=0, my $k = 0; $j < @name,$k < @name_mod;) {               
        #doing something   
   }

任何人都知道如何修复它?  任何建议都非常感谢

3 个答案:

答案 0 :(得分:6)

perl中的for循环应该如下所示:

for (INITIALIZE; TEST; STEP) {
  BODY;
}

在这种情况下:my $j=0, my $k =0是您的INITIALIZE部分。您的TEST(条件)由$j < @name,$k < @name_mod组成。这应该评估为布尔值(truefalse)。该错误是因为您的两个测试之间存在,。您可能希望将,替换为&&,AND运算符或||,OR运算符。

让代码看起来像这样:

for (my $j=0, my $k = 0; $j < @name && $k < @name_mod; ) {               
    #doing something   
}

我对perl的体验有限但我认为如果你有output = TEST1,TEST2这样的表达式,可能会导致output == TEST2离开TEST1被忽略。因此导致无用的比较错误。

答案 1 :(得分:5)

问题已经得到解答,但我会解释为什么你会看到这个特别的警告。这与comma operator的错误使用有关。逗号运算符会丢弃除最后一个参数之外的所有参数的结果。由于它不需要除最后一个参数之外的所有结果,因此它为它们提供了void上下文。这是一种了解方法:

use v5.10;

sub print_context {
    my $name = shift;

    print "$name ";

    if (wantarray) {
        say "list"
    } elsif (defined wantarray) {
        say "scalar"
    } else {
        say "void";
    }
}

for (; print_context(1), print_context(2), print_context(3); ) {
    last
}

输出结果为:

1 void
2 void
3 scalar

因此,可以看出前两个参数获得一个void上下文,最后一个参数获得一个标量上下文(因为for循环期望条件部分中的标量)。由于<运算符希望您使用比较结果,因此如果在void上下文中使用它会显示警告,其中结果将是未使用的。

答案 2 :(得分:3)

好的,所以 - 从评论中 - 你要比较两个数组。

大概在你的循环中,你正在做类似的事情:

 if ( $name[$j] == $name_mod[$k] ) { 

所以我的建议是 - 不要这样做:

for ( my $index = 0; $index < @name and $index < @name_mod; $index++ ) { 
    if ( $name[$index] == $name_mod[$index] ) { 
         #do something
     }
}

或许:each_array

my $ea = each_array(@name, @name_mod);
while ( my ($cur_name, $cur_name_mod ) = $ea->() )   { .... }