2015-09-25 54 views
2

我的大概愚蠢的問題抱歉,但我得到以下警告:沒用使用無效的情況下數字LT(<)的

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

任何人:

"Useless use of numeric lt (<) in void context" 
運行該代碼時

知道如何解決它? 任何建議,不勝感激

+1

你究竟想要完成什麼?它看起來像你試圖運行雙循環迭代器,但一個好的答案將取決於_why_你試圖做到這一點。 – Sobrique

+0

因爲我需要一次比較兩個數組。 – pawankalyan

+2

爲什麼你不能簡單地使用相同的迭代器? – Sobrique

回答

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->()) { .... } 
6

for循環在Perl應該是這樣的:

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

在這種情況下:my $j=0, my $k =0是您的INITIALIZE部分。您的測試(條件)由$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

我也建議這種操作對於'for'循環來說是一個糟糕的選擇,因爲它沒有迭代器增量。 – Sobrique

+1

'output = TEST1,TEST2'的結果取決於上下文,即輸出的類型。對於標量'$ output',你得到TEST1(因爲優先級,你可以從'$ output =(TEST1,TEST2);')獲得TEST2。對於'@ output',一個數組,你得到沒有括號的TEST1和兩個TEST。 – choroba

5

這個問題已經得到解答,但我會解釋你爲什麼看到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

你最好回答這個問題:「他爲什麼會得到這個錯誤?」,所以這值得我的+1。解決問題很重要,但瞭解編譯器抱怨什麼也很重要(這就是爲什麼你正在修復它)。 – Axeman

+0

從口譯員的角度來看很好的解釋。 –

相關問題