Как я могу просмотреть массив, отфильтровывая совпадения? - PullRequest
5 голосов
/ 15 июля 2011

Существует ли быстрый и простой способ выполнить поиск в массиве, найдя элементы, удовлетворяющие некоторому критерию и удалить их из исходного массива?

Например, я хотел бы

@a = (1, 7, 6, 3, 8, 4);
@b = grep_filter { $_ > 5 } @a;

# now @b = (7, 6, 8)
# and @a = (1, 3, 4)

Другими словами, я хочу разбить массив на два массива: те, которые соответствуют, и те, которые не соответствуют определенному условию.

Ответы [ 4 ]

9 голосов
/ 15 июля 2011

Знайте свои библиотеки, ман.

use List::MoreUtils qw(part);
part { $_>5 } (1, 7, 6, 3, 8, 4)

возвращает

(
    [1, 3, 4],
    [7, 6, 8],
)
8 голосов
/ 15 июля 2011
my @a = (1, 7, 6, 3, 8, 4);
my (@b, @c);    

push @{ $_ > 5 ? \@b : \@c }, $_ for @a;
3 голосов
/ 16 июля 2011

Использование библиотек хорошо, но для полноты, вот функция, указанная в вопросе:

0 голосов
/ 15 июля 2011

Это то, что вы хотите?

@a = (1, 7, 6, 3, 8, 4);
@b = grep_filter { $_ > 5 } @a;
@a = grep_filter { $_ < 5 } @a;

сделать еще один grep с вашим отрицательным условием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...