【问题标题】:perl smartmatch on array literal数组文字上的 perl 智能匹配
【发布时间】:2013-04-15 00:02:01
【问题描述】:
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

诚然,第二种形式并不比第一种更简洁,但我很想知道第一种失败的原因。

【问题讨论】:

  • 添加 -w 警告可以让您了解正在发生的事情。
  • 上面写着Useless use of a constant (2) in void context at -e line 1. 仍然不确定为什么它是一个无效的上下文。

标签: perl


【解决方案1】:

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])

【讨论】:

    【解决方案2】:

    看起来这可行

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2021-11-06
      • 1970-01-01
      • 2013-05-31
      • 2015-09-29
      • 1970-01-01
      相关资源
      最近更新 更多