и хвостовые пробелы лучше вызвать
$text = " Now is the time."; $text =~ s/^\s+//; print $texts; Now is the time.
Чтобы отсечь "хвостовые" пробелы, годится команда:
$text = "Now is the time. "; $text =~ s/\s+$//; print $texts; Now is the time.
Чтобы отсечь и начальные, и хвостовые пробелы лучше вызвать последователно эти две команды, чем использовать шаблон, делающий отсечение ненужных пробелов за один раз. Поскольку процедура сопоставления шаблона и текста достаточно сложна, на эту простую операцию может уйти гораздо больше времеви, чем хотелось бы.
Например в тексте нужно найти текст, находящийся между открывающим и закрывающим тегом:
$text="<a>blah-blah</a>"; if($text=~m!<([a|b])>(.*?)/\1!ig){ print "$2\n"; }
найдет все слова, стоящие между тегами <a></a> и <b></b>.
В регулярных выражениях пристутствует своя семантика: быстрота, торопливость и возврат. Если квантификатор * совпадает во многих случаях, то в результате быдет выведен наибольший по длинне результат. Это жадность. Быстрота: поиск старается найти как можно быстрее. "Text"=~/m*/, по смыслу символов m нет, но в результате будет возвращено значение 0. Т.е. формально 0 и более символов.
$test="aaooee ooaao"; $test=~s/o*/e/; print $test; eaaooee ooaao
потому что 1 элемент сторки - 0 и более символов.
Если добавить квантификатор g, то результат будет таким:
eaeaeeeeee eeaeaee
т.к строка содержит 13 мест, где может встречатся o, в том числе и пустых.
Модификаторы:
/i игнорировать регистр
/x игнорировать пропуски в шаблоне и разрешить комментарии.
/g модификатор разрешающий выполнение поиска/замены везде, где это возможно
/gc не сбрасывается позиция при неудачном поиске.
/s разрешается совпрадение . с \n, игнорируется $*.
/m разрешить совпадение ^ и $ для начала и конца строки во внутренних переводах строк
/o однократная компиляция
/e правая часть s/// представляет собой выполняемый код
/ee правая часть s/// выполняется, после чего возвращаемое значение интерпретируется снова.
Содержание Назад Вперед