Подтвердить что ты не робот

Как определить, существует ли элемент в массиве Perl 6

Я думал, что для этого был бы простой ответ для этого где-то в Интернете, но похоже, что мне трудно найти решение. Я прежде всего задаюсь вопросом, есть ли для этого простой способ или функция:

например. ~~ или array.contains() от Perl 5

Было бы также интересно узнать, сколько разных способов достижения этого результата есть в Perl 6, поскольку некоторые из них могут быть лучше других, учитывая ситуацию проблемы.

4b9b3361

Ответ 1

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 проверяет эквивалентность, если вам нужна личность, вам придется перебирать массив и === it.

Вы можете включить Array в Set и использовать индексы.

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

Ответ 2

Другой способ сделать это:

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

Ответ 3

Sub first documentation. sub first возвращает соответствующий элемент или Nil. Nil - значение false, означающее, что вы можете использовать результат в контексте Bool, чтобы определить, содержит ли массив соответствующий элемент.

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

На sub first есть несколько наречий, которые изменяют результаты. Например, чтобы вернуть индекс вместо элемента, можно использовать наречие :k. В этом примере мы также локализуем результат для использования в инструкции if:

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