Анимация
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

таксис с одинарными кавычками. Во второй строке выполняется основная часть рабо-т1- Счетчик. $index инициализируется значением 0 и . циклически увеличивается на единицу, пока не будет достигнуто значение §flavors. В данном случае vors находится в скалярном контексте и имеет значение 5 - количество элементов массива.

Не правда ли, что для такой простой задачи, как перебор элементов массива, нужно выполнить большое количество работы? Наверняка в Perl должны быть предусмотрены средства, позволяющие упростить громоздкий код. Данный случай - не исключение. В Perl имеется, еще не рассмотренный нами, оператор цикла foreach. Оператор foreach устанавливает индексную переменную, называемую итератором, принимающую в цикле значение каждого элемента списка. Рассмотрим следующий пример:

fcKBadh Scon Vors) {

Ecdnt "Я рснск мсрснеЕ из $сза\Е;

. Здесь переменная $сопе последовательно принимает значение каждого элемента массива Как только $сопе принимает значение очередного элемента массива

выполняется тело цикла, выводящее сообщение с этим элементом. Не забывайте, что в цикле foreach итератор не просто принимает значения всех элементов списка. Фактически итератор здесь используется как указатель, поэтому модификация переменной $сопе в теле цикла приводит к модификации соответствующих элементов массива Вот пример:

foEBadh $flavar (iflavors) {

$flavar="$flavDr короженое"; * Щ)сткэ!Е(циг ккдавикацин кассива iflavors! ЕТплЬ "Я пюблю $flavor";

Во второй строке происходит модификация переменной $flavor - к ее значению

добавляется слово мороженое. В третьей строке выводится фраза "Я любою щоколдпцое мороженое", а затем подобные строки печатаются и для остальных сортов мороженого. После окончания цикла окажется, что к каждому элементу массива добавле-

но слово мороженое.


В Perl служебные слова foreach и for - синонимы. Любое из них можно использовать вместо другого. В этой книге для ясности оператор foreachf) используется для итерации в массиве, а оператор for() - для обычных циклов, о которых шла речь на 3-м занятии, "Управление процессом выполнения программы". Имейте в

в.иду что эти операторы взаимозаменяемы.

Взаимные преобразования массивов и скаляров

В Perl нет общего правила для преобразования массивов в скаляры и наоборот. Вместо этого предлагается набор функций и операторов для выполнения таких преобразований. Один из способов преобразования скаляра в массив предполагает использование функции split. Этой функции передается в качестве второго аргумента скаляр, который она разбивает на элементы массива в соответствии с шаблоном, заданным первым аргументом (в примере он заключен в символы косой черты).

gwords=split(/ /, "В хЕсу рсдитась елсяк");

74 I. cEi Perl



После выполнения этого кода массив будет содержать слова В, лесу, родилась

и елочка без пробелов. Если исходная строка не определена, используется значение переменной Если функция split вызывается без параметров, то выполняется разбиение на слова переменной $ . При этом в качестве символа-разделителя используется пробел. Существует также специальный шаблон разбиения (нулевой шаблон),

разделяющий скаляр на индивидуальные символы, как показано ниже:

while (<STDIH>) {

($firstchar)=split{ , $ );

print "Первый символ введенной строки - $firstchar\n";

>

В данном примере с терминала считывается отдельная строка и помещается в переменную $ . Следующая строка кода разбивает неременную $ на отдельные символы. При этом используется нулевой шаблон. В результате функция split возвращает

список всех символов, находящихся в переменной Этот список присваивается списку, расположенному слева от оператора присваивания. Первый элемент присваивается переменной $firstchar, а остальные элементы отбрасываются.


Используемые в операторе split шаблоны называются регулярными выражениями. Регулярные выражения - это довольно сложная тема, и мы вернемся к ней на 6-м занятии, "Поиск по шаблону". А пока для примеров мы будем использовать простые шаблоны, такие как пробелы, двоеточия и т.п. После того как вы познакомитесь с регулярными выражениями, я приведу примеры использования более сложных шаблонов для разделения скаляров с помощью оператора split.

Описанный метод преобразования скаляра в список часто используется в Perl. При разделении скаляра, имеющего определенную структуру, например записи с полями, удобно использовать для частей имена, например:

gMusic=(White А1Ьшц,Beatles,

. Graceland,Paul Simon, A Boy Narred Sue, Goo Goo Dolls); foreach Srecord {SMusic) {

{$record name, $artist) = split{/,/, $record);

} .

При использовании списка переменных сразу аидно, что первое поле записи - это название альбома, а второе поле - исполнитель. При обычном преобразовании в массив значения полей не были бы столь очевидными.

Кроме разбиения, существует и обратная операция - слияние массивов и образование скаляров. Для этой цели в Perl предусмотрена функция join. Ей передается строка-разделитель и список элементов, которые нужно объединить. Вот пример:

$nuniber=join(,, (1..10)); ;.

Здесь переменное шяЬег присваивается строка 6,7,8,9,10. Вы можете использовать функции split и join для разделения и объединения строк, причем возвращаемое значение одной функции может поступать на вход другой:

$message=TyT был Вася"; print "Строка VSmessageX" состоит из:", joinc-, 8plit( , Smessage));



В этом примере переменная $mes3age преобразуется в список с помощью функции split. Этот список поступает на вход функции join и заново преобразуется в строку, но уже с дефисами. В результате выполнения этого кода будет выведено следующее

сообщение:

Строка был Вася" состоит из:Т-у-т- -б-ы-л- -В-а-с-я

Упорядочивание элементов массива

Иногда требуется изменить порядок следования элементов в массиве. Например, программа на Perl должна прочитать из файла список пользователей, отсортировать их по алфавиту и распечатать. Для сортировки в Perl предусмотрена функция sort, которой в качестве аргумента передается список. Функция возвращает другой список, отсортированный по алфавиту. Исходный массив при этом не модифицируется.

Вот пример:

*Chiefs=qw(KnHHTOH Буи Рейган Картер Фсщ Никсон); print joinC , sort echiefs);

После выполнения этого кода будет выведена строка: Картер Клинтон Никсон Рейган Форд. Имейте в виду, что установленный по умолчанию порядок сортировки использует значения кодов ASCII. Это означает, что символы верхнего регистра имеют преимущество перед символами нижнего регистра. Числа при этом сортируются совсем не так, как вы могли бы ожидать. Они сортируются не по значению. Например, 11 идет после 100. Для сортировки по значению необходимо использовать порядок, отличный от заданного по умолчанию.

Функция sort позволяет выполнять сортировку в нужном вам порядке. Для этого ей в качестве первого параметра необходимо передать код или имя подпрограммы. Внутри блока или подпрограммы используются две неременные $а и $Ь, которые соответствуют двум элементам списка. Задача блока возвратить -1, 0 или 1, если $а меньше $Б, $а равно ?Ь или $а больше ?Ь соответственно. Ниже приведен один из способов сортировки чисел. В массиве ?ni:mbers содержатся числовые значения, которые нужно отсортировать.

?sorted=sort ton(l) if (Sa>Sb);

return (0) if ($a==$b);

return(-1) if ($a<$b);} numbers;

Этот пример, конечно же, будет сортировать числа, но его код выглядит слишком сложно для такой простой задачи. Как и следовало ожидать, в Perl есть замена такой сложной конструкции - специальный оператор, который в шутку называют "космическим кораблем" <=>. Этот оператор получил свое название из-за того, что он напоминает летающую тарелку (вид сбоку). Он возвращает -1, если левый операнд меньше правого, О - если операнды равны, 1 -если левый операнд больше правого:

§sorted=sort { $a<=>$t;> numbers;

Этот код компактнее, проще и легче читается. Оператор "космический корабль"

можно использовать лишь для сравнения числовых значений.

Для сравнения строк используется оператор стар, работающий подобным образом. Вы можете использовать гораздо более изощренный критерий сортировки, реализовав

его в виде сложной подпрограммы сортировки. Примеры такой сортировки можно

посмотреть в разделе 4 Perl fAq.

76 Часть I. :Ei



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