2010-11-03 71 views
0

爲什麼下面的代碼返回11: - @myarray =(「Rohan」);perl中的數組操作

我得到的解釋是: - 表達式$ scalar x $ num_times,另一方面,返回一個字符串,其中包含$ sc_lar連接在一起的$ num_times副本。 所以應該給10不11 ...
代碼如下: -

print "test:\n"; 
@myarray = ("Rohan"); # this returns 11 
##@myarray = ("Rohan","G"); this returns 22 
@myarray2 = (@myarray x 2); 
@myarray3 = ((@myarray) x 2); #returns Rohan,Rohan and is correct 

print join(",",@myarray2,"\n\n"); 
print join(",",@myarray3,"\n\n"); 

回答

4

發生了什麼事是,x運營商供應標量上下文不僅僅是其右邊的操作數,但其左側和操作,以及 - 除非的LHO由文字括號包圍。

這條規則是由於當Perl不理解擁有一個列表作爲LHO時,從後面向後兼容超古老的Perl代碼。這可能是v1 vs v2,v2 vs v3,或者v3 vs v4。不太記得;不過,很久以前它是一個。古代遺產。

由於N中標量環境中的N個元素的數組,因此在您的場景中使得N == 1"1" x 2 eq "11"

+0

謝謝特克里斯特 - 我只是想出了當埃裏克評論有關標量上下文 - 我評論上面 - 但謝謝你的明確解釋。這個論壇岩石 – rgolwalkar 2010-11-03 15:16:13

+0

我更喜歡解釋爲()x是一個不同於x的運算符(至少在列表上下文中)。不僅LHO的背景發生變化,操作也完全不同(字符串重複與列表重複)。不幸的是,他們最近使得前面的語法錯誤「qw // x」像()x(用於任意分隔符)一樣工作,這使得這是一個更加尷尬的事情來解釋。 – ysth 2010-11-03 16:13:06

+0

非常感謝你的解釋 – rgolwalkar 2010-11-03 20:39:06

4

Perl是做你問什麼。在第一個示例中,該數組處於標量上下文中並返回其長度。然後將其與自身連接兩次。在第二個示例中,您有列表上下文中的數組,並且x運算符重複列表。

+0

Eric,對不起,我感到困惑 - 標量上下文將是一個字符串,將返回5 - 我做了@myarray x 2 - 所以答案應該是10 - 如果我錯了,我很抱歉 - 請你解釋一下? – rgolwalkar 2010-11-03 15:09:55

+0

嘿埃裏克 - 我知道了 - 在標量環境下它會計算單個字符串多數民衆贊成1和我的回答是11這是正確的 - 對不起,謝謝 – rgolwalkar 2010-11-03 15:13:30