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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как объединить два условия поиска в одно? регулярные выражения 
:(
    Опции темы
Suppir
Дата 27.8.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

if (/^!ACT/ && !/-\d/){$act=0; next}
if (/^!ACT/){$act=1; next}


Как объединить эти два условия в одно?
Если строка начинается с "!ACT" и в строке НЕТ "-\d", то $act=0
А если строка начинается с "!ACT" и в строке есть "-\d", то $act=1;
PM MAIL   Вверх
dva300
Дата 27.8.2010, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



думаю что при отсутствии заведомо оговоренных допущений - никак.
если же файл изначально "правильный" то можно применить следующий код

Код

use strict;
my $str = "!ACT -3434";
my $act = ($str =~ /^!ACT.*?-\d+/) ? 1 : 0;
print "$act";


если же в файле есть "мусор" вида  !PPP sjhfsjfhksljlk jl -3434 (т.е строки начинаются не только с !ACT) то нулевое значение не будет отражать реальное положение вещей - нужно предварительно готовить правильный файл.
или оставить все как есть.
Кстати, вот это условие if (/^!ACT/){$act=1; next} не говорит нам что в строке есть \d
--------------------
Участник движения Культура Вождения
PM   Вверх
Suppir
Дата 27.8.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dva300, дело в том, что дальше есть проверка 

if (defined $act)

т.е. $act может быть undefined, ==0 и ==1

Если попалась строка ^!ACT, то $act уже или 0 или 1. 
Если далее в строке есть -\d, то $act = 1, иначе $act=0.

Добавлено @ 16:21
Цитата(dva300 @  27.8.2010,  15:39 Найти цитируемый пост)
Кстати, вот это условие if (/^!ACT/){$act=1; next} не говорит нам что в строке есть \d 


очень просто:
if (/^!ACT/ && !/-\d/){$act=0; next}  # сдесь в конце идет next. Значит, есть в строке нет -\d, то после $act=0 эта строка больше не обрабатывается.

сюда мы попадаем, только если первая строка не сработала. Однако, в строке есть !ACT, поэтому $act=1
if (/^!ACT/){$act=1; next}

Добавлено @ 16:23
Т.е. нужно составить регулярное выражение с условием:

если нашли ^!ACT,  то
    1) если нет -\d, то $act=1
    2) иначе $act = 0
иначе не трогаем $act
    

Это сообщение отредактировал(а) Suppir - 27.8.2010, 16:25
PM MAIL   Вверх
Suppir
Дата 27.8.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



попробую вот так:
/^!ACT(?(?!-d)$act=0|$act=1)/;
PM MAIL   Вверх
dva300
Дата 27.8.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



я думаю что чем проще тем лучше.
не пройдет и пары м. и вы (или кто-то другой) будит читать данные конструкции очень долго + вспоминать логику.

вообщем я категорично против такого рода оптимизации кода smile
--------------------
Участник движения Культура Вождения
PM   Вверх
Suppir
Дата 27.8.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



после долгой возни и тестов я пришел к такому же выводу smile
PM MAIL   Вверх
Grost
Дата 31.8.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Suppir @  27.8.2010,  16:15 Найти цитируемый пост)
если нашли ^!ACT,  то
    1) если нет -\d, то $act=1
    2) иначе $act = 0
иначе не трогаем $act

может я не совсем в тему, но всё же.. почему не воспользоваться стандартным if elsif?
Код

if(/^!ACT/ && !/-\d/){$act=0; next}
elsif (/^!ACT/){$act=1; next}
else{}; #по необходимости

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


Бывалый
*


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

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



Цитата

может я не совсем в тему, но всё же.. почему не воспользоваться стандартным if elsif?

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

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


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

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


 




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


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

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