Анимация
JavaScript


Главная  Библионтека 

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

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