Как я могу проверить, содержит ли массив Perl конкретное значение?

Я пытаюсь выяснить способ проверить на существование значения в массиве, не выполняя итерации через массив.

Я читаю файл для параметра. У меня есть длинный список параметров, с которыми я не хочу иметь дело. Я поместил эти нежелательные параметры в массив @badparams.

Я хочу считать новый параметр и если он не существует в @badparams, обработайте его. Если это действительно существует в @badparams, перейдите к следующему чтению.

226
задан brian d foy 19 May 2010 в 15:27
поделиться

3 ответа

Просто превратите массив в хэш:

my %params = map { $_ => 1 } @badparams;

if(exists($params{$someparam})) { ... }

Вы также можете добавить дополнительные (уникальные) параметры в список:

$params{$newparam} = 1;

И позже получите список (уникальных) параметров:

@badparams = keys %params;
182
ответ дан 23 November 2019 в 03:52
поделиться

Вы, конечно, хотите хэш здесь. Поместите плохие параметры в качестве ключей в хэш, а затем решите, существует ли конкретный параметр в хэше.

our %bad_params = map { $_ => 1 } qw(badparam1 badparam2 badparam3)

if ($bad_params{$new_param}) {
  print "That is a bad parameter\n";
}

Если вы действительно заинтересованы в том, чтобы сделать это с массивом, посмотрите на List::Util или List::MoreUtils

2
ответ дан 23 November 2019 в 03:52
поделиться

Есть два способа сделать это. Вы можете использовать бросок значений в хэш для таблицы поиска, как было предложено в других сообщениях. (Я добавлю еще одну идиому.)

my %bad_param_lookup;
@bad_param_lookup{ @bad_params } = ( 1 ) x @bad_params;

Но если это данные, состоящие в основном из словесных символов и не слишком много метасимволов, вы можете бросить их в чередование регексов:

use English qw<$LIST_SEPARATOR>;

my $regex_str = do { 
    local $LIST_SEPARATOR = '|';
    "(?:@bad_params)";
 };

 # $front_delim and $back_delim being any characters that come before and after. 
 my $regex = qr/$front_delim$regex_str$back_delim/;

Это решение должно быть настроено на те типы "плохих значений", которые вы ищете. И опять же, оно может оказаться совершенно неподходящим для определенных типов строк, так что caveat emptor.

0
ответ дан 23 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: