perl smartmatch在数组文字上

时间:2013-04-15 00:02:02

标签: perl

slu@new-host:~ 19:59:33
❯ perl -e "print (2 ~~ (1, 2, 3))"
slu@new-host:~ 19:59:39
❯ perl -e "my @a = (1, 2, 3); print (2 ~~ @a)"
1

不可否认,第二种形式并不比第一种形式简洁得多,但我很想知道为什么第一种形式失败。

2 个答案:

答案 0 :(得分:4)

1,2,3是列表文字或列表运算符,而不是数组文字。标量上下文中的列表运算符返回其最后一个操作数计算的值,因此

print (2 ~~ (1, 2, 3))

装置

print(2 ~~ 3)  # Plus two void context warnings

鉴于此

print (2 ~~ @a)

的语法糖
print(2 ~~ \@a)

你可以使用

print(2 ~~ do { my @a = (1,2,3); \@a })

或接近等效但更短的

print(2 ~~ [1,2,3])

答案 1 :(得分:0)

看起来这样有效

slu@new-host:~ 20:00:31
❯ perl -e "print (2 ~~ [1, 2, 3])"
1