如何从Match对象的块中获取可变字符串?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

我正在尝试将Match对象中的块映射到具有可变字符串值的Pairs数组 - 我想这需要对字符串进行标量化。我可以通过将它们放在方括号中并将它们编入索引来找出如何做到这一点的唯一方法:

 my @n =map { $_.key => [$_.value.Str][0] }, G::parse($str).chunks;

使用$(..)进行标量化并不起作用,也没有克隆等。必须有更规范的方式。为什么没有$(..)工作 - 这不是它的用途吗?

提问于
用户回答回答于

您可以通过执行以下操作将不可变字符串放入标量容器中:

my @n = map { $_.key => my $ = $_.value.Str }, G::parse($str).chunks;

然后你可以稍后修改标量容器的内容(但不能修改字符串的内容):

@n[0].value = "Hello";
用户回答回答于

这里要点几件事:

  • 字符串不是不可变的。但你可能并不是那个意思。您可能只是意味着在容器中包含字符串,因此可以更改这些容器的内容。
  • =>,如果它在一个容器对构造函数不decontainerize其右手价值。因此,如果barScalar包含字符串的容器,则foo => bar构造一个对,其值为Scalar包含该字符串的容器。
  • $(...)用于括号表示即使是复数容器也要被视为单数的表达式。(这个镜像@(...)用于括起一个被视为复数的表达式,即使它是一个单数容器或值。)
  • 你认为$(...)构建一个Scalar容器并不奇怪。(毕竟,%(...)构造一个Hash,为什么不呢?)但是你必须使用Scalar声明符。
  • 最简洁的Scalar声明符是一个匿名的状态下Scalar使用$ = ...。但是@Håkon已经my $ = ...在他们的回答中使用了。为什么?因为{...}闭包调用map之间保持状态调用它。如果您刚刚使用,$ = ...那么您Scalar将为所有对使用相同的容器。相反,你需要my $ = ...获得Scalar每对价值的新鲜价值。

扫码关注云+社区

领取腾讯云代金券