数组上的perl6文本替换

问题描述 投票:11回答:2

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

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

perl6
2个回答
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"]

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中的所有函数,以及它们在标量与列表上下文中的作用。)


您不想在单个数组值上调用.subst,而是要在它包含的每个值上调用它。

有几种方法可以做到这一点:

my @ = @a.map( *.subst(…) )

my @ = @a».subst(…)

my @ = do for @a { .subst(…) }

my @ = @a.duckmap( -> Str $_ { .subst(…) } ) # only change Str's
© www.soinside.com 2019 - 2024. All rights reserved.