我正在尝试将Match对象中的块映射到具有可变字符串值的Pairs数组-我想这需要对字符串进行标量处理。我可以通过将它们放在方括号中并为它们建立索引来弄清楚如何做到这一点的唯一方法:
my @n =map { $_.key => [$_.value.Str][0] }, G::parse($str).chunks;
用$(..)标量无效,克隆等也无效。必须有一种更规范的方法。为什么$(..)不能正常工作-不是它的用途吗?
答案 0 :(得分:8)
这里要取消的几件事:
P6中的所有字符串都是不可变的。 (感谢Liz。:))但是,您可能并不意味着要获取可变的字符串。您可能只是想在容器中包含字符串,以便可以更改这些容器的内容。
=>
对构造函数不会在容器中取消右值的容器化。因此,如果bar
是一个包含字符串的Scalar
容器,那么foo => bar
会构造一个对,其值就是包含该字符串的Scalar
容器。
$(...)
用于在表达式上加上括号,即使该表达式是复数容器,也应将其视为单数。 (这反映了@(...)
的用法,该括号用于括住即使是单数容器或值也要被视为复数的表达式。)
您以为$(...)
会构造一个Scalar
容器也就不足为奇了。 (毕竟,%(...)
构造了一个Hash
,为什么不呢?)但是,您必须使用一个Scalar
声明符。
最简洁的Scalar
声明符是使用$ = ...
的{{3}}的声明符。但是@Håkon在回答中使用了my $ = ...
。为什么?因为{...}
调用的map
闭包保留了两次调用之间的状态。如果仅使用$ = ...
,则将对所有对重复使用相同的Scalar
容器。相反,您需要my $ = ...
才能获得每对值的新鲜Scalar
。
答案 1 :(得分:5)
您可以执行以下操作将不可变字符串放入标量容器中:
my @n = map { $_.key => my $ = $_.value.Str }, G::parse($str).chunks;
然后,您以后可以修改标量容器的内容(但不能修改字符串的内容):
@n[0].value = "Hello";