Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка шаблонов текста, {одно|другое}, ищется код для обработки 
V
    Опции темы
Logo
Дата 1.6.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Нужно из шаблона текста, по типу {раз|два{три|четыре}} получить список всех строк, ему соответствующих. У кого-нить есть код? 
PM MAIL   Вверх
klem4
Дата 1.6.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Код

for ( qw[a10 10a 1b20x] ) {
    print "$_\n" if  /(a|b)(10|20)/
}


Выводит слова, в которых есть фрагмент, начинающийся с a или b, за которыми следуют 10 или 20.

Это сообщение отредактировал(а) klem4 - 1.6.2009, 17:22
PM MAIL   Вверх
Logo
Дата 1.6.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Вы не поняли, надо по шаблону сгененрировать все возможные совпадения. 

PM MAIL   Вверх
klem4
Дата 1.6.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Я думаю, для этого необходимо иметь строго оговоренный синтаксис шаблона, из чего он может состоять. Какие логические операторы в нем могут быть, на сколько видно из вашего примера, как минимум возможен оператор OR и вложенные скобки. Не тривиальная задачка-то выходит.
PM MAIL   Вверх
Logo
Дата 1.6.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Ну да, кроме оператора ИЛИ ничего и не надо. Разве что оператор ?, аналогичный ? регекспов, но это вопрос удобства. Синтаксис любой. Согласен, задача не на час-другой, поэтому ищу готовое решение.
PM MAIL   Вверх
gcc
Дата 2.6.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



{раз|два{три|четыре}}

так разве не будет?
Код

$content =~ /(?:hi)|(?:ho)((?:hi)|(?:ho))/;



PM WWW ICQ Skype GTalk Jabber   Вверх
Logo
Дата 2.6.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Объясняю. Есть строка "{свежие|спелые} {яблоки|груши}". Программа должна вывести список всех строк, соответствующих шаблону, т.е.
Код

свежие яблоки
свежие груши
спелые яблоки
спелые груши

PM MAIL   Вверх
gcc
Дата 2.6.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Код

#!/usr/bin/perl

$co[0] = 'svej yabl';
$co[1] = 'svej gru';
$co[2] = 'spel yabl ';
$co[3] = 'spel gru';

@d = grep { /(?:34)|(?:34)(?:34)|(?:gru)/i } @co;

print "@d\n\n";



Код

@d = grep { /(34)/ || /(34)/ && /(svej)/ || /(gru)/ } @co;





Это сообщение отредактировал(а) gcc - 2.6.2009, 11:46
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 2.6.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



gcc, прочитал ваш код 3 раза. Все равно не понимаю. Не поясните?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 2.6.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



мне надо было выбрать из строки определенные слова и сохранить всю строку, строки были из программы
я написал так:

Код

if ($str =~ /(?:34)|(?:34)|(?:34)|(?:34)/i)  {


Это сообщение отредактировал(а) gcc - 2.6.2009, 12:39
PM WWW ICQ Skype GTalk Jabber   Вверх
arto
Дата 2.6.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



PM MAIL ICQ   Вверх
KSURi
Дата 2.6.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



gcc, а что такое 34? И зачем матчить строку одному паттерну 4 раза (еще и в группирующих скобках)? Почему отключена проверка регистра?
Это обоснованно? Если да, то пожалуйста, приведите ссылку на соответствующий раздел документации.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 2.6.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



нет, сори мне просто показалось что так писать нельзя =~ /(34) || (yabl)/i в примере видел примерно (уже не понмю что за регулярка) именно так 
Код

(?:hi)|(?:ho)

и так писал

я вопрос наверное не понял

Это сообщение отредактировал(а) gcc - 2.6.2009, 14:19
PM WWW ICQ Skype GTalk Jabber   Вверх
klem4
Дата 2.6.2009, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 27.7.2008

Репутация: 2
Всего: 2



Если не принимать во внимение вложенность скобок, то получиться короче. В общем на вариант без скобок ссылка выше есть. А со скобками вот что выходит:

Код
#!/usr/bin/perl 
use strict;

  #my $str = "{{A|B}{1|2}}";   # A1, A2, B1, B2 
  #my $str = "{{A}{B|C|D}}";   # AB, AC, AD 
  my $str = "{AB{C{1|2}|D}}";  # ABC1, ABC2, ABD  
  &get_variants( $str );

  my %result;
  print "$_\n" for ( keys %result );

sub get_variants {
  my $pattern = shift; my $pcopy = $pattern;

  if ( $pattern =~ s/\{([^{}]+?)\}// ) {

    my @vars = split /\|/, $1;

    for my $var ( @vars ) {
      (my $tmp = $pcopy) =~ s/\{([^{}]+?)\}/$var/;
      &get_variants( $tmp );
    }
  } else { ++$result{$pcopy} };
}

PM MAIL   Вверх
Logo
Дата 2.6.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



klem4
Спасибо, то что нужно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.