我的大概愚蠢的問題抱歉,但我得到以下警告:沒用使用無效的情況下數字LT(<)的
for (my $j=0, my $k = 0; $j < @name,$k < @name_mod;) {
#doing something
}
任何人:
"Useless use of numeric lt (<) in void context"
運行該代碼時
知道如何解決它? 任何建議,不勝感激
我的大概愚蠢的問題抱歉,但我得到以下警告:沒用使用無效的情況下數字LT(<)的
for (my $j=0, my $k = 0; $j < @name,$k < @name_mod;) {
#doing something
}
任何人:
"Useless use of numeric lt (<) in void context"
運行該代碼時
知道如何解決它? 任何建議,不勝感激
好的,所以 - 從評論 - 你正在比較兩個數組。
想必你的循環中,你正在做的事情,如:
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->()) { .... }
for循環在Perl應該是這樣的:
for (INITIALIZE; TEST; STEP) {
BODY;
}
在這種情況下:my $j=0, my $k =0
是您的INITIALIZE部分。您的測試(條件)由$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
被忽略。從而導致無用比較的錯誤。
這個問題已經得到解答,但我會解釋你爲什麼看到p關節警告。它與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
因此,可以看出,前2個參數獲得無效的情況下,最後一個得到一個標量上下文(因爲for
循環需要條件部分中的標量)。由於<
運算符期望您使用比較的結果,因此如果在無效的上下文中使用結果將不使用的結果,將顯示警告。
你最好回答這個問題:「他爲什麼會得到這個錯誤?」,所以這值得我的+1。解決問題很重要,但瞭解編譯器抱怨什麼也很重要(這就是爲什麼你正在修復它)。 – Axeman
從口譯員的角度來看很好的解釋。 –
你究竟想要完成什麼?它看起來像你試圖運行雙循環迭代器,但一個好的答案將取決於_why_你試圖做到這一點。 – Sobrique
因爲我需要一次比較兩個數組。 – pawankalyan
爲什麼你不能簡單地使用相同的迭代器? – Sobrique