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

时间:2016-02-16 03:16:12

标签: arrays list containers perl6 raku

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

e.g。来自Perl 5的~~array.contains()

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

3 个答案:

答案 0 :(得分:13)

my @a = <foo bar buzz>;
say so 'bar' ∈ @a;
say so @a ∋ 'buzz';
# OUTPUT«True␤True␤»

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

我相信Set检查等价性,如果你需要身份,你必须循环遍历数组并===

您可以将Array转换为Set并使用下标。

say @a.Set{'bar'};
# OUTPUT«True␤»
say @a.Set<bar buzz>;
# OUTPUT«(True True)␤»

答案 1 :(得分:11)

另一种方法是:

my @a = <foo bar buzz>;
if 'bar' eq any(@a) {
    say "yes";
}
# OUTPUT«yes␤»

答案 2 :(得分:4)

Sub first documentation. sub first返回匹配的元素或NilNil是一个假值,意味着您可以在Bool上下文中使用结果来确定数组是否包含匹配元素。

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

sub first有几个副词可以改变结果。例如,要返回索引而不是元素,可以使用:k副词。在此示例中,我们还将结果局部化,以便在if语句中使用:

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