Анимация
JavaScript
|
Главная Библионтека Строки 14-15. Переданная функции print eHip() строка находится в переменное [0]. Она разбивается на отдельные поля, и полученные значения для удобства адения присваиваются переменным $last irstи т.д., которые являются приватными для функции ешр (). Строка 17. Фамилия и имя сотрудника объединяются в одну строку с помощью функции intf. В результате полученную строку можно будет легко поместить в поле фиксированной ширины и выровнять по левому краю. Строки 18-20. Строка отчета форматируется и выводится на печать. Для получения величины зарплаты количество отработанных часов (переменная ?time) нужно умножить на почасовую тарифную ставку (переменная $hourly). Для выполнения правильного округления к двум значащим цифрам к произведению прибавляется значение .005. Списки и стеки До сих пор мы рассматривали списки и массивы как линейные структуры данных, доступ к элементам которых осуществлялся с помощью индексов ис. 9.3).
Рис. 9.3. ГрЕр ЧЕ ур А теперь включите свое воображение и представьте себе этот массив элементов в виде вертикальной стопки (рис. 9.4). В компьютерной терминологии подобная структура данных называется стеком. Стеки обычно используются там, где необходимо выполнить обработку элементов списка в определенном порядке. Хорошим примером использования стека могут служить компьютерные карточные игры. В них каждый расклад карт представляется в виде стека. Сначала карты в колоде расположены рубашкой вверх. По мере необходимости карты переворачиваются и извлекаются из колоды (т.е. из стека). Кроме того, при отбое отыгравшие карты складываются в верхнюю часть колоды. В Perl элементы стека обычно хранятся в массиве. Для помещения элемента в вершину стека используется функция push, а для извлечения элемента из стека - функция pop. Кроме того, можно поместить элемент в нижнюю часть стека и удалить его оттуда - по аналогии с колодой карт. Для этого используются функции shift и unshift соответственно. Операции со стеком проиллюстрированы на рис. 9.5. Синтаксис перечисленных выше функций выглядит так: pop массив shift массив unshift массив, вовыв спасок push нассив, вовыи спесок Функции pop и shift удаляют один элемент из массива. Если параметр пассив не указан, то будет удален один элемент либо из массив , либо MGV. Функции pop и shift возвращают в вызвавшую программу удаленный из массива элемент, а если массив пуст, то возвращается значение undef. При этом соответствующим образом уменьшается и размер массива. Push Ананас Гуава Гуава Манго Слива Груша Яблоко 9.4. Пр Манго Слива Груша Персик Виноград Яблоко Unshift Shift Рис. 9.5. Операции со стеком Внутри подпрограмм функции pop, shift, unshift и push модифицируют переменную @ , если не указан другой массив. В теле главной программы эти функции модифицируют массив ШОУ, если не указан другой массив. Функции push и unshift добавляют элементы новогосписка в массив. При этом соответствующие азом -увеличивается размер массива. Элемент спяси могут быть представлены в виде списка, массива или скаляра, как показано в следующем примере. eband=qw(rrpoi(6oH); push §band, qw(rHTapa кларнет); # В массива tend сейчас содержится три элемента: ♦ "тромбон", "гитара", "кларнет" $brass=shiftStand; I Переменная $brass равна "тромбон" $n=po t Переменная ind равна "кларнет" • \ В массиве § band сейчас содержртгся одрш элемент - гитара unshift Sband, "аккордеон"; \ В массива nd сейчас содержится два элемента: деон" и "гитара" Операции добавления и удаления элементов массива с помощью функций push, pop, shiftи unshift гораздо эффективнее аналогичных операций, выполненных вручную. .Например, код push §list,g.newitems эффективнее, чем glist=(81ist,.enewiteras). Перечисленные выше функции Perl специально оптимизированы для выполнения подобных операций над массивами. При работе со стеком не стоит забывать и о том, что его элементы ничем не отличаются от элементов обычных массивов, которые можно адресовать с помощью дексов. При этом началу стека (или его нижней части) соответствует индекс 0, а вершине стека - последний элемент массива. Слияние и разделение массивов До сих пор мы В1ПОЛНЯЛИ с массивами такие операции, как обращение к элементу по индексу, разделение массива на отдельные скаляры, а также всевозможные стековые манипуляции. Теперь пришла пора рассмотреть еще одну функцию - splice, с помощью которой можно выполнять как слияние, так и разделение массивов. Ее синтаксис выглядит так: spliceмассив, смещевве splice массив, снещевве, длвва spl поемассив , смещевве. длина , список Функция splice удаляет из массива элементы, начиная с заданного смещения. При этом удаленные элементы возвращаются в вызывающую программу. Отрицательные значения смещения означают, что соответствующий элемент отсчитывается не с начала, а с конца массива. Если указан параметр длина, то удаляется указанное количество элементов массива. Если указан параметр список, то после удаления указанного количества элементов вместо них в массив помещаются элементы из списка. Во время выполнения подобных операций размер массива соответствующим образом уменьшается или увеличивается. Вот несколько примеров: § veg=qw( морковь кукуруза) ; фИсе (iveg, О, 1); * В массиве Sveg находится один I элемент: "кукуруза" ф11се {8veg, О, О, qw{ropox)); В массиве §veg находятся два * элемента: "горох", "кукуруза" splice (§veg, -1, 1, ду(ячмень, репа)); # В массиве Sveg находятся три * элемента: "горох", "ячмень", "репа" splice (gveg, 1, 1); * В массиве §veg находятся два * элемента: "горох", "репа" Резюме На этом занятии вы узнали, что для выполнения поиска одной строки в другой необязательно использовать регулярные выражения; для этого вполне достаточно функций index и rindex. Кроме того, вы научились выполнять простые подстановки с помощью оператора tr /. Для выделения части строки, а также для редактирования строки можно иснользовать функцию substr. Для создания отчетов, форматирования текстовых строк и округления чисел предусмотрены функции printf и sprintf. И в заключение были рассмотрены нелинейная структура данных (стек) и способы работы со стеком. Вопросы и ответы Можно ли обойтись без функций substr, index и rindex? Для чего- они вообще нужны, если практически все можно сделать с помощью регулярн1х выражений? Во-первых, использование регулярных выражений для выполнения простых видов поиска и замены строк крайне неэффективно. Функции index и rindex работают зна- 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 |