我很抱歉这个可能很愚蠢的问题,但我收到以下警告:
"Useless use of numeric lt (<) in void context"
运行此代码时:
for (my $j=0, my $k = 0; $j < @name,$k < @name_mod;) {
#doing something
}
任何人都知道如何修复它? 任何建议都非常感谢
答案 0 :(得分:6)
perl中的for循环应该如下所示:
for (INITIALIZE; TEST; STEP) {
BODY;
}
在这种情况下:my $j=0, my $k =0
是您的INITIALIZE部分。您的TEST(条件)由$j < @name,$k < @name_mod
组成。这应该评估为布尔值(true
或false
)。该错误是因为您的两个测试之间存在,
。您可能希望将,
替换为&&
,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->() ) { .... }