Глава 15: Другие операции преобразования данных.
15.1 Поиск подстроки
Успех поиска подстроки зависит от того, где вы ее потеряли. Если вы потеряли ее в большей строке — вам повезло, потому что в такам случае может помочь операция index. Вот как ею можно воспользоваться:
$х = index($строка, $подстрока)
Perl находит первый зкземпляр указанной подстроки в заданной строке и возвращает целочисленный индекс первого символа. Возвращаемый ин-декс отсчитывается от нуля, т.е. если подстрока найдена в начале указанной строки, вы получаете 0. Если она найдена на символ дальше, вы получаете 1 и т.д. Если в указанной строке нет подстроки, вы получаете -1.
Вот несколько примеров:
$where = index("hello","e") ;
$person = "barney";
$where = index("fred barney",$person);
$rockers = ("fred","barney");
$where = index(join(" ",Orockers),$person); # то же самое
Отметим, что и строка, в которой производится поиск, и строка, которая ищется, может быть литеральной строкой, скалярной переменной, содержа-щей строку, и даже выражением, которое имеет строковое значение. Вот еще несколько примеров:
$which = index("a very long string","long"); # $which получает 7
$which = index("a very long string","lame"); # $which получает -1
Если строка содержит искомую подстроку в нескольких местах, то функция index возвращает первый относительно начала строки индекс. Чтобы найти другие зкземпляры подстроки, можно указать для этой функции третий параметр — минимальное значение позиции, которое она будет возвращать при поиске зкземпляра подстроки. Выглядит это так:
Вот несколько примеров того, как работает этот третий параметр:
$where = index("hello world","l"); # возвращает 2 (первая буква l)
$where = index("hello world","l",0); # то же самое
$where = index("hello world","l",1); # опять то же самое
$where = index('hello world","l",3); # теперь возвращает З
# (3 - первая позиция, которая больше или равна 3)
$where = index('hello world","о",5) ; # возвращает 7 (вторая о)
$where = index('hello world","о",8) ; # возвращает -1 (ни одной после 8)
Вы можете пойти другим путем и просматривать строку справа налево с помощью функции rindex, чтобы получить правый крайний зкземпляр. эта функция тоже возвращает количество символов между левым концом строки и началом подстроки, как и раньше, но вы получите крайний правый зкземпляр, а не первый слева, если их несколько. Функция rindex тоже принимает третий параметр, как и функция index, чтобы вы могли получить целочисленный индекс первого символа зкземпляра подстроки, который меньше или равен адресу выбранной позиции. Вот несколько примеров того, что можно таким образом получить:
$w = rindex("hello world","he"); # $w принимает значение О
$w = rindex("hello world","l"); # $w принимает значение 9 (крайняя правая l)
$w = rindex("hello world","о"); # $w принимает значение 7
$w = rindex("hello world","o"); # теперь $w принимает значение 4
$w = rindex("hello world","xx"); # $w принимает значение -1 (не найдена)
$w = rindex("hello world","о",6); # $w принимает значение 4 (первая до 6)
$w = rindex("hello world","o",3); # $w принимает значение -1 (не найдена до 3)