2017-04-01 19 views
1

以下是代碼,實際上,@ arr0和@ arr1並不相等,即使排序後它們也不相等,但爲什麼會打印「eq」?起初,我想到了sort函數的返回值,但它確實返回了一個數組,所以原因是什麼?perl比較使用智能匹配排序的數組

my @arr0 = (1,2); 
my @arr1 = ("a","b"); 

if ((sort @arr0) ~~ (sort @arr1)) { 
    print "eq\n"; 
}; 
+0

你正在使用什麼Perl版本? smartmatch運營商已經改變了幾次。我不記得用例數組和數組是否受到影響,但最好告訴我們。 – simbabque

+0

Perl版本是v5.12.1,謝謝。 – orange

+0

對於當前的5.24.1行爲,它應該在每對數組上執行字符串相等。但是你有列表,而不是數組。這可能會有所作爲。也許他們被迫進入標量環境。我現在沒有電腦。嘗試直接放置數組。 – simbabque

回答

2

[注:所有鏈接到文檔中的這個答案是爲5.12.1版本的文檔。這確保了答案對原始海報有用 - 它可能使其對其他人不那麼有用。]

認識到數組和列表不同是很重要的。這是行爲不同的一種情況。

同樣重要的是說讀documentation for sort(),開始:

在列表環境,這個列表進行排序並返回排序列表值。在標量上下文中,sort()的行爲是未定義的。

這裏有兩件重要的事情。首先,在列表上下文中,sort()返回一個列表,而不是一個數組。其次,在標量環境下,其行爲是不確定的。我們來看看smartmatch documentation。這是一個左右操作數的大表,我不會在這裏重現。但請注意,它根本沒有提及列表。因此,幾乎可以肯定,smartmatch在標量上下文中調用sort(),並對結果(表中最後幾行之一)執行字符串或數字比較 。

但是我們知道sort()在標量上下文中的行爲是不確定的。那麼誰知道smartmatch比較什麼價值。但是我猜想,無論它返回的隨機值如何,它都(至少)爲你的兩個列表返回相同的隨機值。這意味着它們看起來是平等的。

正如您在評論中所說的那樣,它在將排序結果保存在數組中並將數組傳遞給smartmatch時起作用。這是因爲數組在smartmatch表中定義了特殊的行爲。

  • 數組沒有列出
  • 不要在標量上下文調用sort()

更新:作爲ThisSuitIsNotBlack在評論中提到,smartmatch一直很不穩定,因爲它是在Perl 5.10介紹。自從那時起,它的行爲在幾乎所有Perl版本中都進行了調整,其最終形式仍未完全達成一致。出於這個原因,我強烈勸阻你完全不使用它。

+1

我會添加第三個要點:不要使用smartmatch。這是實驗性的,未來肯定會改變。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot:是的,我打算提一提。感謝您的提醒。我已將它添加到我的答案中。 –

+0

Re * *自從*以來,它的行爲在幾乎所有Perl版本中都進行了調整「,這不是事實。只有兩個變化:5.10.1(功能變化)和5.18(標記爲實驗)。 – ikegami