我正在尝试将文本替换应用于整个数组。
但是,当我尝试更改数组时,它表明它只有1个元素,而应该有26个。
下面在Perl6 REPL中的示例:
> my @a = 'a'..'z'
[a b c d e f g h i j k l m n o p q r s t u v w x y z]
> my @a1 = @a.subst(/<[aeiou]>/, 1, :g)
[1 b c d 1 f g h 1 j k l m n 1 p q r s t 1 v w x y z]
> @a1.elems
1#this should be 26
> @a.elems
26
如何更改整个数组中具有文本替换的数组并返回数组?
还:perl6网站关闭,我无法访问许多手册页:(
答案 0 :(得分:16)
通过使用>>.
超级运算符:这将在列表的每个元素上调用给定方法,并创建调用结果的列表。
my @a = "a".."z";
my @b = @a>>.subst(/ <[aeiou]> /, 1, :g);
dd @a, @b;
# Array @a = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
# Array @b = ["1", "b", "c", "d", "1", "f", "g", "h", "1", "j", "k", "l", "m", "n", "1", "p", "q", "r", "s", "t", "1", "v", "w", "x", "y", "z"]
答案 1 :(得分:5)
.subst
是 Str 方法。
这意味着它假定它的第一个参数(倡导者)是 Str 。如果还不是 Str ,它将被强制为 Str 。
在数组上调用.Str
时,它将所有值和一个空格作为分隔符连接起来。
my @a = < a b c >;
say @a.perl; # ["a", "b", "c"]
say @a.Str.perl; # "a b c"
所以这三行是完全等效的:
@a.subst(/<[aeiou]>/, 1, :g);
@a.Str.subst(/<[aeiou]>/, 1, :g);
@a.join(" ").subst(/<[aeiou]>/, 1, :g);
Perl6这样做是因为它是一致的。您始终知道,对.subst
的单个调用的输出是单个 Str 。您还知道,该倡导者被视为 Str 。
如果它在数组上做了不同的事情,将很难跟踪哪些方法根据那里的发起者及其变化而改变。
我们只需要看一下Perl5,就可以知道在每个函数不一致时记住每个函数的难易之处。
(尝试考虑一下Perl5中默认在$_
上运行的所有功能,以及它们在标量vs.列表上下文中的作用。)
您不想在单个数组值上调用.subst
,而是希望在它包含的每个值上调用它。
有几种方法可以做到这一点:
my @ = @a.map( *.subst(…) )
my @ = @a».subst(…)
my @ = do for @a { .subst(…) }
my @ = @a.duckmap( -> Str $_ { .subst(…) } ) # only change Str's