В Perl проверка массива на предмет значения и удаление его, если существует для каждого значения другого массива - PullRequest
2 голосов
/ 10 августа 2010

По сути, у меня есть массив, скажем, @badvalues.

У меня есть другой массив, скажем, @values.

В принципе, я хочу это:

Для каждого элемента в @badvalues

  • Проверьте, есть ли оно в @values
  • Если это так, удалите его
  • В конечном итоге я должен получить либо массив @values, не содержащий элементов в массиве @badvalues, либо новый массив @goodvalues, содержащий каждый элемент @values, который не является элементом @badvalues.

Я знаю, это звучит просто, и, возможно, это потому, что я устал, но я не могу найти четкого ответа на этот вопрос при поиске вокруг.

Ответы [ 3 ]

10 голосов
/ 10 августа 2010
# Get only bad values
my %values = map {$_=>1} @values;
my @new_badvalues = grep { !$values{$_} } @badvalues;

# Get only good values
my %badvalues = map {$_=>1} @badvalues;
my @goodvalues = grep { !$badvalues{$_} } @values;

# An alternative
@badvalues{@badvalues} = ();
foreach $item (@values) {
    push(@goodvalues, $item) unless exists $badvalues{$item};
}

Для более полной ссылки, пожалуйста, смотрите "Глава 4.7. Поиск элементов в одном массиве, но не в другом" "Perl Cookbook"

1 голос
/ 11 августа 2010

Немного быстрее и менее потребляющая память версия подхода, показанная в Ответ ДВК

my %badvalues;
@badvalues{@badvalues} = ();
my @goodvalues = grep !exists $badvalues{$_}, @values;
1 голос
/ 10 августа 2010

Если у вас есть современная версия Perl, например, скажем> = 5.10.1, то вы также можете сделать это:

my @final_good = grep { !($_ ~~ @badvalues ) } @values;

или для более четкого приоритета:

my @final_good = grep { not $_ ~~ @badvalues } @values;

Это использует оператор smartmatch, который был добавлен в Perl 5.10.

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