perl6: массив;избавиться от пустого слота (любой) - PullRequest
0 голосов
/ 28 мая 2018

Для массива, содержащего только элементы Str, я могу использовать grep (Str) для удаления пустого слота после: delete;

Например:

my @prov_cd = <AB BC MB NB NL NS ON PE QC SK>;

@prov_cd[2]:delete;                              # Manitoba deleted

@prov_cd;                                        # [AB BC (Any) NB NL NS ON PE QC SK]

my @prov_cd_cleanup = @prov_cd.grep(Str);        # get rid of (Any) empty slot: [AB BC NB NL NS ON PE QC SK]

@prov_cd = @prov_cd_cleanup;                     # [AB BC NB NL NS ON PE QC SK]

Может массивсодержать различные типы объектов;Я бы предпочел "grep" для всего, что не является (Any).

Как я могу это сделать?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Во-первых, обратите внимание, что если вы удалите записи с помощью сращивания вместо :delete, элементы будут смещены, и «дыры» не будут сгенерированы.

Теперь, если вы действительнохотите отфильтровать только Any, вы можете сделать это через

@prov_cd.grep(* !=== Any)

Однако я подозреваю, что вы ищете

@prov_cd.grep(*.defined)
0 голосов
/ 29 мая 2018

Чтобы повторить вышеприведенные мнения и привести пример, вы можете вместо этого использовать splice, который также возвращает значение "сращивание", если необходимо.

my @prov_cd = <AB BC MB NB NL NS ON PE QC SK>;

# Starting from index 2, remove the next 1 items
my $removed = @prov_cd.splice(2, 1);

say @prov_cd;  # OUTPUT: [AB BC NB NL NS ON PE QC SK]
say $removed;  # OUTPUT: [MB]

Обратите внимание, что splice всегда возвращает массив, даже если вы удалили только 1 предмет.

say $removed.^name;  # OUTPUT: Array
0 голосов
/ 28 мая 2018

Это будет делать:

@prov_cd.grep(*.defined) (AB BC NB NL NS ON PE QC SK)

В качестве альтернативы вы можете посмотреть на сращивание .

...