2012-07-28 81 views
3

編程的Perl,使用smartmatch以「任何」的左邊和右邊的檢查數值等於一個數字:

------------------------------------------------------------------------------ 
| Left | Right | Description | Like (But Evaluated in Boolean Context) | 
------------------------------------------------------------------------------ 
| Any | Num | Numeric equality |    Any == Num    | 

因此,我期待下面的輸出1

my @arr = ('aaa'); 
my $num = 1; 
say @arr ~~ $num; 

但它實際上輸出空字符串。

我認爲@arr將被轉換爲標量1,因爲它有1個元素,所以say @arr ~~ $num將相當於say @arr == $num

爲什麼@arr ~~ $num@arr == $num不同?

回答

3

smartmatch操作符顯然不會將列表作爲操作數。因此,它在標量上下文中評估它的操作數。如果是這樣的故事的結尾,以下是行不通的

my @a = ('aaa', 'bbb'); 
my $s = 'aaa'; 
say $s ~~ @a; 

,因爲這將是相同的

say 'aaa' ~~ 2; 

但很明顯,它的工作。這是因爲smartmatch會自動創建對其數組或散列操作數的引用,就像push對其第一個操作數所做的那樣。這意味着

say $s ~~ @a; 

真的

say $s ~~ \@a; 

和(代碼)

say @a ~~ $n; 

相同

say \@a == $n; 

你需要得到長度明確。下面將做你想要什麼:

say [email protected] ~~ $n; 

當然,這樣會

say [email protected] == $n; 

甚至

say @a == $n; 
+0

感謝這個答案,我發現了「The」這個音符「並不總是一個精確的翻譯」。所以它不應該被視爲完全平等的選擇 – user907860 2012-07-28 15:21:09

2

這是因爲smartmatch首先需要參考。 @array ~~ $num將相當於\@array == $num,這顯然是非常不可能是真實的。

你可能想用我的Smart::Match模塊和非令人驚訝的方式做@array ~~ array_length($num)@array ~~ contains($num)和其他東西。

+0

從 「編程的Perl」:'的smartmatch隱含解引用任何nonblessed散列或數組引用, 因此在這些情況下適用HASH和ARRAY條目。所以看起來smartmatching必須在數組上完成,而不是引用,不是嗎? – user907860 2012-07-28 12:00:30

+0

@caligula:那麼「Perl編程」會令人迷惑。你可以爲此責怪我,我是校對人員之一...... – 2012-07-30 19:40:54

相關問題