Поиск

Поиск скаляров

Регулярные выражения — прекрасный способ поиска скаляров по шаблонам, но иногда это просто стрельба из пушки по воробьям. В Perl некоторые "накладные расходы" (впрочем, небольшие) связаны с трансляцией шаблона, а затем поиском этого шаблона среди скаляров. Кроме того, при написании регулярных выражений легко ошибиться. В Perl предусмотрено несколько функций поиска и извлечения простой информации из скаляров.

Функция index

Если вы просто хотите найти одну строку внутри другого скаляра, воспользуйтесь предусмотренной для этого в Peri функцией index. Ее синтаксис выглядит следующим образом:

Функция index начинает просмотр строки слева и ищет в ней подстроку. Функция index возвращает позицию, в которой найдена подстрока, причем значение 0 соответствует крайней левой позиции в строке. Если подстрока не найдена, то функция index возвращает значение -1. Искомая строка может состоять из букв, быть скаляром или любым выражением, возвращающим строковое значение. Подстрока — это не регулярное выражение, а просто другой скаляр.

Ниже приведено несколько примеров. Помните, что функции и операторы Perl можно записывать, заключая аргументы в круглые скобки или не делая этого.

Можно также (хотя это и необязательно) указать при вызове функции index начальную позицию в строке, с которой нужно начать поиск, как показано в следующем примере. Чтобы выполнить поиск с начала строки (с крайней левой позиции), используйте начальную позицию 0.

Можно также использовать функцию index с начальной позицией, чтобы "пройти" всю строку и найти все случаи вхождения в нее подстроки, как показано в следующем примере:

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

Функция index из предыдущего примера выполняет в цикле сканирование строки $source, как показано ниже:

Поиск в обратном направлении с помощью функции rindex

Функция rindex работает точно так же, как index, за исключением того, что поиск начинается с крайнего правого символа строки и проводится в левую сторону. Синтаксис данной функции выглядит следующим образом.

Если поиск закончен,а подстрока не найдена, то функция rindex возвращает значение -1. Ниже приведено несколько примеров.

По сравнению с функцией index, код для реализации обратного поиска в цикле с помощью функции rindex выглядит несколько иначе. Причина заключается в том, что функция rindex начинает поиск с правого крайнего символа строки. Поэтому в качестве начальной позиции для поиска следует указать символ, расположенный за последним символом строки. Для этого вполне подойдет значение, возвращаемое функцией length ($source), как показано в следующем примере. Выполнение цикла следует завершить как только функция rindex возвратит значение -1. После нахождения каждого очередного элемента значение переменной $ start должно быть уменьшено на 1, а не увеличено, как в случае использования функции index.

Выделение части строки с помощью функции substr

О функции substr часто забывают, не придавая ей особого значения, хотя она предоставляет универсальный метод выборки информации из скаляров и их редактирования. Синтаксис этой функции выглядит следующим образом:

Функция substr берет строку, начиная с позиции, указанной во втором параметре, и возвращает оставшуюся часть строки (т.е. начиная с позиции смещение идо конца). Если параметр длина задан, то берется подстрока соответствующей длины. Если же в результате происходит выход за пределы строки, то просто берется подстрока до конца строки. Это продемонстрировано в следующем примере.

Если задано отрицательное значение параметра смещение, то функция substr начинает отсчет справа. Например, substr($a, -5) возвращает пять последних символов строки $а. Если задано отрицательное значение параметра длина, то функция substr возвращает подстроку от начальной позиции и до конца строки, за исключением последних символов, количество которых определяется параметром длина. Например:

В предыдущем фрагменте функция substr начала работу с 30-й позиции и вернула оставшуюся часть строки за исключением последних 4-х символов.

Функцию substr можно использовать также в левой части оператора присваивания. Такая конструкция позволяет указать, какие символы в скаляре должны быть заменены. В качестве первого аргумента функции substr следует задать скалярную переменную, а не строку символов, которой будет присваиваться значение. Ниже приведен пример редактирования строки с помощью функции substr,