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


На самом деле массив data здесь использован в специальном контексте, называемом булевым, или логическим. Это разновидность скалярного контекста со схожим действием. Булев контекст имеет место, когда Perl ожидает получить логическое значение, например в условном выражении оператора if. Еще одна разновидность контекста, называемая пустым контекстом (void), будет рассмотрена на 9-м занятии, "Дополнительные функции и операторы". [

Возвращаясь к старой теме

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

Функция print ожидает в качестве аргумента список. Неважно, в каком контексте формируется этот список. Поэтому функция print с массивом foo, переданным в.ка-честве аргумента, распечатывает элементы этого массива, находящегося в контексте списка:

print

Для навязывания скалярного контекста можно использовать псевдофункцию scalar:

print

Здесь печатается количество элементов массивное. Функция scalar определяет скалярный контекст для ifoo, поэтому массив возвращает количество своих элементов, выводимое впоследствии функцией print.

Рассмотренной нами на 2-м занятии, "Строительные блоки Perl: числа и строки", функции chomp может быть передан в качестве аргумента как скаляр, так и массив. В скалярном аргументе удаляется завершающий символ-разделитель записей. Если аргументом является массив, символ-разделитель удаляется в конце каждого скалярного элемента.

Вы уже знаете, как прочитать данные, вводимые с клавиатуры, используя <STDIN>. Угловые скобки - это специальный оператор Perl, который, в зависимости от контекста, ведет себя по-разному. В скалярном контексте этот оператор читает с терминала одну строку. В контексте списка этот оператор читает весь поток данных, поступающих с терминала, до символа конца файла и помешает затем все данные в список. Сравните:

Скалярный контекст,

* в переменную $а помещается одна строка. "

e¥hole=<STDIN>; f Контекст списка, все введенные строки

I помещаются в нассЕВ iwhole. (Sa)=<STDIN>; I Контекст списка, все введенные строки помещаются в список.

Какое значение получает переменная $а в третьем примере? Помните, выше мы говорили, что если в левой части оператора присваивания находится список, причем количество его элементов меньше, чем в списке, находящемся в правой части, то избыточные элементы правой части отбрасываются. Таким образом, в третьем примере будут считаны все данные с терминала, но в переменную $а помещается только первая введенная строка.




Что такое конец файла? После окончания ввода с терминала надо дать знать Perl, что ввод данных завершен. Для этого нужно набрать символ конца файла (EOF). Что это за символ, зависит от операционной системы. В UNIX таким символом является <Ctrl+D>, помещенный в начале строки. В MS-DOS или Windows признаком конца файла являются два идущих подряд символа <Ctrl+Z>, которью могут располагаться в любом месте текста.-

Оператор повторения, рассмотренный на занятии, "Начало работы с Perl", в контексте списка ведет себя специфическим образом. Если левый операнд оператора

повторения взят в скобки и сам оператор находится в контексте списка, то возвращается список с элементами, соответствующими левому операнду. В этом примере создается список из звездочек:

estars= С*") х 100;

Левый операнд "*" оператора повторения находится в скобках, а. значение полученного выражения присваивается массиву, что и определяет контекст списка. Такой синтаксис применяется для инициализации элементов массива одинаковыми значениями.

Другой часто используемый оператор, который вообще мало кто относит к категории операторов, - запятая (,). Пока мы лишь использовали ее для разделения элементов списка литералов, например:

epets=(KOBica, Собака, Рыбки, Канарейка, Игуана);

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

Slast pet=(Koiixa, Собака, Рыбки, Казараока, ИЬуавза); f Освоэ! ш то, что Еымогпи хгдаать!

Здесь названия домашних животнгх, расположенные справа от оператора присваивания, с точки зрения Perl не являются списком. Это группа строковых литералов, значение которых вычисляется в скалярном контексте слева направо (из-за скаляра $last pet, расположенного в левой части). В результате переменной $last pet

присваивается значение Игуана.

Другой пример - функция local time, в зависимости от контекста, имеет два абсолютно различных варианта поведения. В скалярном контексте функция localtime возвращает форматированную строку текущего времени. Например, оператор print scalar(localtime) напечатает что-то похожее Thu Apr 13 10:14:45 2000. В контексте списка функция localtime возвращает список элементов, описывающих текущее время:

($sec, $min $year off, Swday, $yday, $isdBt)=localtine;

Значения этих элементов приведены в табл. 4.1.

Таблица 4.1. Возвращаемые значения функции 1 time в контексте списка

Поле

Значение

$sec

Секунды, 0-59

$min

Минуты, 0-59 .

$hour

Часы, 0-23

$mctey

День месяца, 1-28, 29, 30 или 31

Чть I. :Ei Perl



Окончат пабл. 4.1

Поле

Значение

$mday День месяца, 1-28, 29, 30 или 31

$mon Месяц, 0-.11 (обратите внимание!)

Syear off Количество лет, прошедших с 1900 года. Прибавив к этому числу 1900, вы получите корректное значение текущего года

$wday День недели, 0-6

$yday День года, 0-364 или 365

$isdst Истина, если действует летнее время


Большинство проблем 2000 года в программах на Perl были связаны с неправильным использованием параметра $уеаг off, возвращаемого функцией localtiiae. Чтобы получить текущий год, больщинство программистов добавляло к значению этого параметра строку 19. Однако следует учитывать тот факт, что разница между текущим и 1900 годом в 1999 году равна 99, в 2000 году- 100. Арифметическое же сложение этого значения с 1900 будет корректно работать и после 2000 года. Сам Per! давно избавлен от ошибки Y2K, но использование параметра 5уеаг off с префиксами 19 или 20 действительно может привнести ее в вашу прог"рамму..

Как же узнать, какой контекст создают аргументы определенной функции или оператора и как эта функция или оператор ведет себя в различн1х контекстах? Это не так-то просто, поскольку единой методики нет. В документации представлены все функции и операторы с объяснением их поведения в зависимости от нескольких факторов. В дальнейшем мы будем обращать ваше внимание, если встретившаяся впервые в этой

книге функция специфическим образом ведет себя в различных контекстах.

Работа с массивами

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

Поэлементная работа с массивом

На 3-м занятии, "Управление процессом выполнения программы", были рассмотрены циклы while, for и некоторые другие конструкции управления течением программы. Многие задачи, выполнение котор1х требует использования массивов, связаны с поэлементной обработкой массива, называемой итерацией. Один из способов организации итерации - использование цикла for, например:

?flavors=qw( Шокощпное Ванильное Клубничное Пломбир Фруктовое}; for (5index=0; Sindex<eflavors; $index++) {

print любимый сорт мороженого - $flavors($index)";

print а также все остальные.\п";

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



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