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

paw*_*yan 2 perl

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

"Useless use of numeric lt (<) in void context"
Run Code Online (Sandbox Code Playgroud)

运行此代码时:

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

任何人都知道如何解决它?,任何建议非常感谢

Ale*_*ijk 6

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

for (INITIALIZE; TEST; STEP) {
  BODY;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下:my $j=0, my $k =0是你的INITIALIZE部分.您的测试(条件)包括$j < @name,$k < @name_mod.这应该计算为布尔值(truefalse).错误是因为,您的两个测试之间存在差异.你可能要替换,与任&&时,与运营商,或与|| OR运算符.

使您的代码看起来像这样:

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

我用Perl的经验是有限的,但我认为,如果你有一个表达式,比如output = TEST1,TEST2它可能会导致output == TEST2留下TEST1被忽略.因此导致无用比较的错误.


svs*_*vsd 5

问题已经得到解答,但我会解释为什么你会看到这个特别的警告.它与错误使用逗号运算符有关.逗号运算符会丢弃除最后一个参数之外的所有参数的结果.由于它不需要除最后一个参数之外的所有结果,因此它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
}
Run Code Online (Sandbox Code Playgroud)

输出是:

1 void
2 void
3 scalar
Run Code Online (Sandbox Code Playgroud)

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