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


Автор: Suppir 27.8.2010, 14:31
Код

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


Как объединить эти два условия в одно?
Если строка начинается с "!ACT" и в строке НЕТ "-\d", то $act=0
А если строка начинается с "!ACT" и в строке есть "-\d", то $act=1;

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

Код

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

Автор: Suppir 27.8.2010, 16:15
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:30
попробую вот так:
/^!ACT(?(?!-d)$act=0|$act=1)/;

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

вообщем я категорично против такого рода оптимизации кода smile

Автор: Suppir 27.8.2010, 17:25
после долгой возни и тестов я пришел к такому же выводу smile

Автор: Grost 31.8.2010, 14:28
Цитата(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{}; #по необходимости

Автор: dva300 31.8.2010, 16:07
Цитата

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

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

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