Анимация
JavaScript
|
Главная Библионтека 9-й час 5Р gilllP Дополнительные "01 функции *£:,, иоператоры В культуре Perl есть такая традиция: "Существует более одного способа сделать что-либо". На этом занятии мы познакомимся с данной философией поближе. Мы рассмотрим целую "сборную солянку" новых функций и операторов. При поиске скалярных величин и выполнении операций над ними вы до сих пор использовали регулярные выражения. Но поскольку в Perl существует более одного способа сделать что-либо, в нем предусмотрены различные функции поиска и редактирования скаляров. Итак, на этом занятии вы познакомитесь с некоторыми новыми способами. Кроме того, раньше мы рассматривали массивы как линейные списки элементов, перебор которых осуществлялся с помощью оператора foreach, а объединение в скалярную переменную - с помощью функции join. На этом занятии вы познакомитесь с совершенно новым взглядом на массивы. И, наконец, мы вновь обратимся к абсолютно "пресной" функции print и добавим ей немного остроты и привлекательности. С помощью обновленной и улучшенной функции print вы тоже сможете создавать тщательно отформатированные отчеты, которые не стыдно показать другим людям. Основные темы этого занятия. • Поиск скаляров внутри простых строк. • Подстановка символов. • Использование функции print. • Применение массивов в качестве стеков и очередей. Поиск скаляров Регулярные выражения - прекрасный способ поиска скаляров по шаблонам, но иногда это просто стрельба из пушки по воробьям. В Perl некоторые "накладные расходы" (впрочем, небольшие) связаны с трансляцией шаблона, а затем поиском этого шаблона среди скаляров. Кроме того, при нанисании регулярных выражений легко ошибиться. В Perl нредусмотрено несколько функций ноиска и извлечения нростой информации из скаляров. Функция index Если вы нросто хотите найти одну строку внутри другого скаляра, воснользуйтесь цредусмотренной для этого в Peri функцией index. Ее синтаксис выглядит следующим образом: index строка, подстрока index строка, подстрока, вачапъвая позиция Функция index начинает просмотр строки слева и ищет в ней подстроку. Функция index возвращает позицию, в которой найдена подстрока, причем значение 0 соответствует крайней левой позиции в строке. Если подстрока не найдена, то функция index возвращает значение -1. Искомая строка может состоять из букв, быть скаляром или любым выражением, возвращающим строковое значение. Подстрока - это не регулярное выражение, а просто другой скаляр. Ниже приведено несколько примеров. Помните, что функции и операторы Perl можно записывать, заключая аргументы в круглые скобки или не делая этого. infe "ВгЕсурсщсапась еючка", "вючка"; f BcPTpaipeica 16 index("iHTb - хорово, а жраю жпь - aip лучве", "еиэ"); ♦ Вазиирегоя 29 ?а="Новое - зшэ хорово зпое старое"; index(Sa, "это"); I авЕЕшрегоя 8 index($а, "навое"); IBoBEpaiipercH-l 1а=ду(пвеннца рнс яямшь); infexjolnC ", На), "рс"; * ВавЕрапрется 8 Можно также (хотя это и необязательно) указать при вызове функции index начальную позицию в строке, с которой нужно начать поиск, как показано в следующем примере. Чтобы выполнить поиск с начала строки (с крайней левой позиции), используйте начальную позицию 0. $павез="Герц Г1=рт=тт ГхпхгаоЕВ Герцигова"; index(Snames, "Гвд") ;1 Возтренрегоя О index($naaes, Терц",1);1 Возтренрегоя 5 Можно также использовать функцию index с начальной позицией, чтобы "пройти" всю строку и найти все случаи вхождения в нее подстроки, как показано в следующем примере: $source=Tepq Герцен Герцеговина Герцвгова"; Sstart=0,- f Что&л наЙЕи все вховдения слова "Гвд", мы будем f шотьзовать n»os $ start в качестве шчапысй \ Еозкщии ДЛЯ пс№ка. Ери этсм згаченш ивёшвшш. $start \ будет все время увеличиваться while (($ s tart=index (Ssource," Герц", $s tart)) 1 =-1) { print "Навдею слово Гед в $start-ft позиции\п; Sstart++; В результате выполнения данного примера будет выведено следующее: Найдено слово Герц в 0-й позиции Найдено слово Герц в 5-й позиции Найдено слов рц в 12-й позиции Навдено слово Гфц в 24-й позиции Функция index из предыдущего примера выполняет в цикле сканирование строки как показано ниже: Перемер $start присваивался значение О Герц Герцен Герцеговина Герцигова Функция index слово Герц в 0-й позиции строки, после чего это знение присваивался переменной Sstart Функция index снова запускается с 1-й позиции строки (Sstart+1) Герц Герцен Герцеговина Герцигова Функция index находит еще одно слово Герц в 5-й позиции строки Поиск в обратном направлении с помощью функции rindex Функция rindex работает точно так же, как index, за исключением того, что поиск начинается с крайнего правого символа строки и проводится в левую сторону. Синтаксис данной функции выглядит следующим образом. rindex строка, подстрока rindex строка, подстрока, вачальаая поэвцвя Если поиск закончен, а подстрока не найдена, то функция rindex возвращает значение -1. Ниже приведено несколько примеров. Sa= "шка косолапый по лесу идет, шишки собирает..."; rindex($a, "ишк"); I Возвращает 31 rindex($а, "ишк", 30); I Возвращает 1 По сравнению с функцией index, код для реализации обратного поиска в цикле с помощью функции rindex выглядит несколько иначе. Причина заключается в том, что функция rindex начинает поиск с правого крайнего символа строки. Поэтому в качестве начальной позиции для поиска следует указать символ, расположенный за последним символом строки. Для этого вполне подойдет значение, возвращаемое функцией как показано в следующем примере. Выполнение цикла следует завершить как только функция rindex возвратит значение -1. После нахождения каждого очередного элемента значение переменной $start должно быть уменьшено на 1, а не увеличено, как в случае использования функции index. Ssource=Tep4 Герцен Герцеговина Герцигова"; Sstart=length(Ssource); while( (Sstart=rindex($source,Tep4" ,$start)) !=-l) { print "Найдено слово Герц в $start-fi позиции\п"; $start~;} 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |