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


Автор: DEER 14.12.2005, 17:00
Здравствуйте,
у меня есть два хеша, надо найти количество совпадений ключей
пытаюсь так
Код

    foreach my $key (keys %hash1)
    {
       if(map /^$key?/, %hash2)
       {
              #нашли совпадение
              $count += 1;
            }
   }

так вот, если в hash1 будет ключ "суд", а в sash2 "гоСУДарство", то он считает, что это совпадение, я вроде указал, что $key должен быть началом и концом строки, но что то не работает.

Не знаете почему?

Автор: BlackLFL 14.12.2005, 17:12
if(map /^$key$/, %hash2)

Автор: DEER 14.12.2005, 17:23
спасибо

Автор: Kannabismus 14.12.2005, 22:31
То, что вы делаете, это проверяете совпадения ключей %hash1 с ключями и значениями %hash2. Если нужно считать совпадения ключей:

Код

foreach my $key (keys %hash1)
{
   if(exists $hash2{$key})
      {
         $count += 1;
      }
}

или короткий вариант с использованием map
Код

map {$count++ if exists $hash2{$_}} keys %hash1

Автор: DEER 15.12.2005, 11:28
ещё один косяк
Код

my @arr = qw(интернет, интернет магазин, через интернет, спутниковый интернет, интернет одежда, интернет работа, интернет магазины одежды, интернет провайдеры, интернет игры, интернет радио, бесплатный интернет, подключение интернета, интернет библиотека, интернет программы, интернет кафе, интернет москва, интернет скачать, интернет заработок, интернет сайт, интернет сети, интернет реклама, интернет телефон, интернет книги, интернет доступ, настройка интернет, заработать интернет, детские интернет, создание интернета, интернет казино, детские интернет магазины, книжные интернет, интернет техники, книжный интернет магазин, интернет карты, интернет магазины техники, скорость интернета, косметика интернет, мобильный интернет, интернет магазин косметики, интернет аптеки, интернет реферат, продажа интернет, женский интернет, интернет обувь, интернет товары, выделенный интернет, телевидение интернет, петербург интернет, интернет магазин обуви, интернет магазин женской);

  if(map  /[Copyright|Яндекс|Ключевые|Статистика|Показов]/, @arr )
  {

    print map  /[Copyright|Яндекс|Ключевые|Статистика|Показов]/, @arr;
    print "ДА!!!!";
}


выводит
ДА!!!!

это что получается? он находит эти слова что ли?
Добавлено @ 11:33
всё, понял.
почему то ему [] не понравились

Автор: Kiber_rat 15.12.2005, 15:59
Ты просто ошибся в регулярном выражении, используй (?: ) вместо [ ].
Код
my @arr = ('интернет','интернет магазин','через интернет',
    'спутниковый интернет','интернет одежда','интернет работа',
    'интернет магазины одежды','интернет провайдеры','интернет игры',
    'интернет радио','бесплатный интернет','подключение интернета',
    'интернет библиотека','интернет программы','интернет кафе',
    'интернет москва','интернет скачать','интернет заработок',
    'интернет сайт','интернет сети','интернет реклама','интернет телефон',
    'интернет книги','интернет доступ','настройка интернет',
    'заработать интернет','детские интернет','создание интернета',
    'интернет казино','детские интернет магазины','книжные интернет',
    'интернет техники','книжный интернет магазин','интернет карты',
    'интернет магазины техники','скорость интернета','косметика интернет',
    'мобильный интернет','интернет магазин косметики','интернет аптеки',
    'интернет реферат','продажа интернет','женский интернет',
    'интернет обувь','интернет товары','выделенный интернет',
    'телевидение интернет','петербург интернет','интернет магазин обуви',
    'интернет магазин женской');
/(?:Copyright|Яндекс|Ключевые|Статистика|Показов)/ ? print "Find: $&\n" : next
    for @arr;
}
$& - текст совпадения (если найдено).

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