如何确定Perl 6数组中是否存在元素

Phy*_*oph 15 arrays containers list perl6 raku

我以为在互联网上的某个地方会有一个简单的答案,但似乎我找不到解决方案.我首先想知道是否有一个简单的方法或功能:

例如,~~array.contains()来自Perl 5

在Perl 6中有多少不同的方法可以实现这一结果也很好,因为考虑到问题的情况,有些方法可能比其他方法更好.

小智 13

my @a = <foo bar buzz>;
say so 'bar' ? @a;
say so @a ? 'buzz';
# OUTPUT«True?True?»
Run Code Online (Sandbox Code Playgroud)

http://doc.perl6.org/language/setbagmix中所述,并在https://github.com/rakudo/rakudo/blob/nom/src/core/set_operators.pm中定义.

我相信Set检查等价,如果你需要身份,你将不得不循环遍历数组===.

您可以将其Array转换为a Set并使用下标.

say @a.Set{'bar'};
# OUTPUT«True?»
say @a.Set<bar buzz>;
# OUTPUT«(True True)?»
Run Code Online (Sandbox Code Playgroud)


msc*_*cha 11

另一种方法是:

my @a = <foo bar buzz>;
if 'bar' eq any(@a) {
    say "yes";
}
# OUTPUT«yes?»
Run Code Online (Sandbox Code Playgroud)


J H*_*all 5

次要优先文档。 sub first返回匹配的元素或NilNil是一个false值,表示您可以在Bool上下文中使用结果来确定数组是否包含匹配的元素。

my @a = 'A'..'Z';
say 'We got it' if @a.first('Z');
say 'We didn\'t get it' if !@a.first(1);
Run Code Online (Sandbox Code Playgroud)

有几个副词可以sub first改变结果。例如,返回索引而不是元素,可以使用:k副词。在此示例中,我们还对结果进行了主题化处理,以供在if语句中使用:

my @a = 'A'..'Z';
if @a.first('Q', :k) -> $index {
    say $index;
}
Run Code Online (Sandbox Code Playgroud)