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