Как определить, существует ли элемент в массиве Perl 6
Я думал, что для этого был бы простой ответ для этого где-то в Интернете, но похоже, что мне трудно найти решение. Я прежде всего задаюсь вопросом, есть ли для этого простой способ или функция:
например. ~~
или array.contains()
от Perl 5
Было бы также интересно узнать, сколько разных способов достижения этого результата есть в Perl 6, поскольку некоторые из них могут быть лучше других, учитывая ситуацию проблемы.
Ответы
Ответ 1
my @a = <foo bar buzz>;
say so 'bar' ∈ @a;
say so @a ∋ 'buzz';
# OUTPUT«TrueTrue»
Как описано в 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;
}