Регулярные выражения Perl и их применение


         

Встроенный код и интеллектуализация поиска - часть 2


Для удобства я применил модификатор x и комментарии. Если переменная $1 определена, то мы в тернарном условном операторе учитываем, что число отрицательное; если $1 имеет неопределенное значение, то берем число из $2 таким, как есть. В операторе

$n=$tmp if !defined($n) || $n < $tmp;

мы не можем аналогично написать

$n=$tmp if !$n || $n < $tmp;

потому что значения $n==0 и $n==undefined будут неразличимы.

В итоге на печать выходит строка

Наибольшее число - это 36

В более красивом случае нужно позаботиться о том, чтобы поиск не начинался сразу после знака минус и чтобы перед подшаблоном (\d+) не было цифры. И все число неплохо заключить в атомарные скобки, т.к. число должно состоять из всех встретившихся подряд цифр и знака минус, если он был.

my ($n,$tmp); $_='-200 0 36 35'; /(?<!-) # перед стартовой позицией не должно быть минуса (?> # атомарная группировка для всего числа (-)? # берем минус в $1, если он есть (?<![\d]) # перед числом не должно быть цифры (\d+) # берем число в $2 ) (?{ $tmp=$1 ? -$2 : $2; # в $tmp получаем число с учетом знака $n=$tmp if !defined $n || $n < $tmp; }) (?!) /x; print "Наибольшее число это $n" if defined $n;

И опять на печать выходит, что

Наибольшее число - это 36




Содержание  Назад  Вперед