Анимация
JavaScript
|
Главная Библионтека в этой главе: • Поиск подотрШи • Извлечение и замена подстроки • Форматирование данных с помощью функции sprintfO • Сортировка по заданным критериям .. • Транслитерация • Упражнения Другие операции преобразования данных Поиск подстроки Успех поиска подстроки зависит от того, где вы ее потеряли. Если вы потеряли ее в большей строке - вам повезло, потому что в таком случае может помочь операция index. Вот как ею можно воспользоваться: $х = index($сгрока, $полсгрока) Perl находит первый экземпляр указанной подстроки в заданной строке и возвращает целочисленный индекс первого символа. Возвращаемый индекс отсчитывается от нуля, т.е. если подстрока найдена в начале указанной строки, вы получаете 0. Если она найдена на символ дальше, вы получаете 1 и т.д. Если в указанной строке нет подстроки, вы получаете -1. Вот несколько примеров: $where = index("hello", "е") ; $person = "barney"; $where = index("fred barney",$person) ; $rockers = ("fred","barney"); $where = index(join (" ",Srockers),$person); # то же самое # $where получает 1 # $where получает 5 Отметим, что и строка, в которой производится поиск, и строка, которая ищется, может быть литеральной строкой, скалярной переменной, содержащей строку, и даже выражением, которое имеет строковое значение. Вот еще несколько примеров: $which = indexCa very long string", "long") ; # $which получает 7 $which = index("a very long string", "lame") ; # $wliich получает -1 Если строка содержит искомую подстроку в нескольких местах, то функция index возвращает первый относительно начала строки индекс. Чтобы найти другие экземпляры подстроки, можно указать для этой функции третий параметр - минимальное значение позиции, которое она будет возвращать при поиске экземпляра подстроки. Выглядит это так: $х = index {$большая строка, маленькая строка, пропуск) Вот несколько примеров того, как работает этот третий параметр: $where = index ("liello world", "1") ; # возвращает 2 (первая буква 1) $where = index("hello world","1",О); # то же самое $where = index("hello world","1",1); # опять то же самое $where = index("hello world","1",3); # теперь возвращает 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","1"); # $w принимает значение 9 (крайняя правая 1) $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", "о", 3) ; # $w принимает значение -1 (не найдена до 3) Извлечение и замена подстроки Извлечь фрагмент строки можно путем осторожного применения регулярных выражений, но если этот фрагмент всегда находится на известной позиции, такой метод неэффективен. В этом случае удобнее использовать функцию substr. Эта функция принимает три аргумента: строковое значение, начальную позицию (определяемую так же, как в функции index) и длину, т.е. $s = substr ($строка, $начало, $ллина) ; Начальная позиция определяется так же, как в функции index: первый символ - нуль, второй символ - единица и т.д. Длина - это число символов, которые необходимо извлечь, начиная от данной позиции: нулевая длина означает, что символы не извлекаются, единица означает получение первого символа, двойка - двух символов и т.д. (Больше символов, чем имеется в строке, извлечь нельзя, поэтому если вы запросите слишком много, ничего страшного не произойдет.) Выглядит это так: $hello = "hello, world"; $grab = substr($hello, 3, 2); # $grab получает "lo" $grab = substr($hello, 7, 100); # 7 до конца, или "world!" Можно даже выполнять подобным образом операцию "десять в степени п" для небольших целочисленных степеней, например: $big = substr("10000000000",О,$power+l); # 10 ** $power Если количество символов равно нулю, то возврашается пустая строка. Если либо начальная, либо конечная позиция меньше нуля, то такая позиция отсчитывается на соответствующее число символов, начиная с конца строки. Так, начальная позиция -1 и длина 1 (или более) дает последний символ. Аналогичным образом начальная позиция -2 отсчитывается от второго символа относительно конца строки: $stuff = substr("a very long string",-3,3); # последние три символа $stuff = substr("а very long string",-3,1); # буква i Если начальная позиция указана так, что находится "левее" начала строки (например, задана большим отрицательным числом, превышающим длину строки), то в качестве начальной позиции берется начало строки (как если бы вы указали начальную позицию 0). Если начальная позиция - большое положительное число, то всегда возвращается пустая строка. Другими словами, эта функция всегда возвращает нечто, отличное от сообшения об ошибке. Отсутствие аргумента "длина" эквивалентно взятию в качестве этого аргумента большого числа - в этом случае извлекается все от выбранной позиции до конца строки*. Если первый аргумент функции substr - скалярная переменная (другими словами, она может стоять в левой части операции присваивания), то сама эта функция может стоять в левой части операции присваивания. Если вы перешли к программированию на Perl из С, вам это может показаться странным, но для тех, кто когда-нибудь имел дело с некоторыми диалектами Basic, это вполне нормально. в очень старых версиях Perl пропуск третьего аргумента не допускался, поэтому первые Perl-программисты использовали в качестве этого аргумента большие числа Вы, возможно, столкнетесь с этим в своих археологических исследованиях программ, написанных Perl. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [ 62 ] 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |