2012-10-30 65 views
2

意外的行爲根據perlop中:Smartmatch-Operator,下面的代碼:智能匹配運營商在Perl

use 5.012; 

my @array = qw/1 2/; 

print @array ~~ 2 
    ? "true" 
    : "false"; 

應該使用規則

左右說明和僞
==== ================================================== =========

任何數字相等(如:任何==數字)

但輸出是「假的」。但我認爲

@array == 2 

應該true.Where做我去錯了嗎?

回答

5

我不確定這個問題,但也許這可以幫助:代碼編譯成一個智能匹配的數組裁判

$ perl -MO=Deparse -e '@a = (1, 2); print @a ~~ 2' 
@a = (1, 2); 
print \@a ~~ 2; 
-e syntax OK 

所以你實際上是檢查參考平等,這應該在大多數情況下是錯誤的。 ;)然而,檢查數組的長度也許是太容易了智能匹配運算符,因爲它可以與==做到:

$ perl -le '@a = (42, 17); print @a == 2' 
1 

我喜歡這種方法,因爲它更明顯,Perl程序員什麼你測試對於。

請注意,智能匹配不是對稱的。反轉訂單對該陣列執行grep搜索:

$ perl -nle '@a = (42, 17); print $_ ~~ @a ? "ok" : "no"' 
1 
no 
2 
no 
17 
ok 
+1

perl -MO = Deparse -e'@a =(1,2);打印2 ~~ @ a'; #=> print 2 ~~ \ @a; .even如果右操作數是一個數組,它仍然顯示爲一個引用。 – perfi