我很抱歉这个可能很愚蠢的问题,但我收到以下警告:
"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)
任何人都知道如何解决它?,任何建议非常感谢
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.这应该计算为布尔值(true或false).错误是因为,您的两个测试之间存在差异.你可能要替换,与任&&时,与运营商,或与|| 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被忽略.因此导致无用比较的错误.
问题已经得到解答,但我会解释为什么你会看到这个特别的警告.它与错误使用逗号运算符有关.逗号运算符会丢弃除最后一个参数之外的所有参数的结果.由于它不需要除最后一个参数之外的所有结果,因此它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上下文中使用,则会显示警告,其结果将是未使用的.
| 归档时间: |
|
| 查看次数: |
969 次 |
| 最近记录: |