数组上的perl6文本替换

时间:2019-04-23 17:07:35

标签: perl6

我正在尝试将文本替换应用于整个数组。

但是,当我尝试更改数组时,它表明它只有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网站关闭,我无法访问许多手册页:(

2 个答案:

答案 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