Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Как узнать есть ли скаляр в массиве?


Автор: Vittaliy 24.10.2007, 10:19
Доброго времен и суток.
С перлом пока на ВЫ. 
Но вот пишу функцию которая формирует строку параметров. 
Есть Хеш со всеми параметрами и есть масив с именами параметров которые должны присутствовать в результате.
Где то встречал какую то встроеную операцию которая возвращает труе если скаляр входит в массив, а вспомнить не могу. Не хочится писать цикл если есть встроенная операция. Подскажите плиз.
Заранее спасибо.

Автор: GoodBoy 24.10.2007, 13:20
Цитата(Vittaliy @  24.10.2007,  11:19 Найти цитируемый пост)
Где то встречал какую то встроеную операцию которая возвращает труе если скаляр входит в массив
в PHP... smile

Автор: amg 24.10.2007, 13:25
Цитата(Vittaliy @  24.10.2007,  10:19 Найти цитируемый пост)
Где то встречал какую то встроеную операцию которая возвращает труе если скаляр входит в массив, а вспомнить не могу.
Это у хэша можно проверить, присутствует ли элемент с данным ключом: exists $hash{$key}. Проверить, входит ли скаляр в массив - через цикл или как-то по-другому, но не одной операцией.

Автор: Vittaliy 24.10.2007, 13:28
Блин. Обидно, а я вот был уверен что гдето такое мне попадалось. Ладно буду делать цикл. Спасибо за ответ.

Автор: GoodBoy 24.10.2007, 14:18
Цитата(Vittaliy @  24.10.2007,  14:28 Найти цитируемый пост)
Ладно буду делать цикл

ну это же Перл!!!  smile 

Код
my @qwe = ('qwe', 'asd', 'zxc', '123', 'edc', 'poi', 'lkj');

my %asd = @qwe;
if (exists $asd{'asd'}) {
    скаляр существует
} else {
    unshift @qwe, pop @qwe;  # как вариант - push @qwe, shift @qwe;
    %asd = @qwe;
    if (exists $asd{'asd'}) {
        скаляр существует
    } else {
        скаляр НЕ существует
    }
}

Понятно? Или пояснить? smile

Автор: korob2001 24.10.2007, 17:46
Ещё вариант:
Код

my $search = "zcc";   # Искомое слово
my @qwe = ('qwe', 'asd', 'zxc', '123', 'edc', 'poi', 'lkj');

print scalar( grep { $_ eq $search } @qwe ) > 0 ? "Cуществует" : "Не существует";

Он же, только в более понятной форме:
Код

my $search = "zxc";   # Искомое слово
my @qwe = ('qwe', 'asd', 'zxc', '123', 'edc', 'poi', 'lkj');

if (scalar( grep { $_ eq $search } @qwe ) > 0) {
    print "Cуществует\n";
} else {
    print "Не существует\n";
}

Пример с поиском по шаблону:
Код

my $search = "zxc";   # Искомое слово
my @qwe = ('qwe', 'asd', 'zxc', '123', 'edc', 'poi', 'lkj');

if (("[".join("][",@qwe)."]") =~ /\[$search\]/o) {
    print "Cуществует\n";
} else {
    print "Не существует\n";
}

Аналогичный предидущему, только вместо регулярного выражения используется index:
Код

my $search = "zxc";   # Искомое слово
my @qwe = ('qwe', 'asd', 'zxc', '123', 'edc', 'poi', 'lkj');

if (index("[".join("][",@qwe)."]", "[$search]") != -1) {
    print "Cуществует\n";
} else {
    print "Не существует\n";
}

Только в последних двух примерах, нужно следить что-бы в искомой строке не встретился разделитель.

Автор: Vittaliy 25.10.2007, 06:24
Сделал вот так:
Код

sub params_to_str(\%,\@,\%) #хеш параметров, масив нужных параметров, хеш доп параметров
 {
   my $rez;
   $_params = $_[0];
   %params = %$_params;
   $_required_params = $_[1];
   $_buf_params = $_[2];
   @required_params = @$_required_params;
   %buf_params = %$_buf_params;
   
   
  foreach $parameter (@required_params)
   {
       if (exists $params{$parameter}){$rez.=" ".$parameter."=\"".$params{$parameter}."\"";}
   }
   
   foreach $parameter (keys (%buf_params))
   {
       $rez.=" ".$parameter."=\"".$buf_params{$parameter}."\"";
   }
   
   return $rez;
 }

Автор: Vittaliy 25.10.2007, 06:46
Мощная вещь оказывается grep.
А склеивание имен в строку и дальнейший поиск по ней, на мой взгляд будет долго работать.

Автор: korob2001 25.10.2007, 17:53
В данном случае использование grep излишне, так как мы используем последовательный поиск, т.е. мы идём по всему массиву от начала и до конца, где нам необходимо найти первое вхождение заданного елемента массива.  grep будет каждый раз проходить по всему массиву, не в зависимости от того, в какой позиции был икомый елемент. Если конечно массив не будет большим, то можно оставить и grep, но если нет уверенности, что массив не разростётся, то всё же лучше заюзать цикл и прерывать его, если найден заданный елемент. С другой стороны, если изначально предполагается, что массив будет большим и уже тем более, если он отсортирован, то возможно стоит подумать об использовании не последовательного поиска, а бинарного.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)