Я пытаюсь выяснить способ проверить на существование значения в массиве, не выполняя итерации через массив.
Я читаю файл для параметра. У меня есть длинный список параметров, с которыми я не хочу иметь дело. Я поместил эти нежелательные параметры в массив @badparams
.
Я хочу считать новый параметр и если он не существует в @badparams
, обработайте его. Если это действительно существует в @badparams
, перейдите к следующему чтению.
Просто превратите массив в хэш:
my %params = map { $_ => 1 } @badparams;
if(exists($params{$someparam})) { ... }
Вы также можете добавить дополнительные (уникальные) параметры в список:
$params{$newparam} = 1;
И позже получите список (уникальных) параметров:
@badparams = keys %params;
Вы, конечно, хотите хэш здесь. Поместите плохие параметры в качестве ключей в хэш, а затем решите, существует ли конкретный параметр в хэше.
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
Есть два способа сделать это. Вы можете использовать бросок значений в хэш для таблицы поиска, как было предложено в других сообщениях. (Я добавлю еще одну идиому.)
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.