Анимация
JavaScript
|
Главная Библионтека На самом деле массив data здесь использован в специальном контексте, называемом булевым, или логическим. Это разновидность скалярного контекста со схожим действием. Булев контекст имеет место, когда Perl ожидает получить логическое значение, например в условном выражении оператора if. Еще одна разновидность контекста, называемая пустым контекстом (void), будет рассмотрена на 9-м занятии, "Дополнительные функции и операторы". [ Возвращаясь к старой теме Многие из операторов и функций Perl обусловливают контекст своих аргументов. Иногда действие операторов и функций также обусловлено контекстом. Некоторые из этих функций нам уже встречались, но мы не обращали внимание на такие их свойства. Функция print ожидает в качестве аргумента список. Неважно, в каком контексте формируется этот список. Поэтому функция print с массивом foo, переданным в.ка-честве аргумента, распечатывает элементы этого массива, находящегося в контексте списка: Для навязывания скалярного контекста можно использовать псевдофункцию scalar: Здесь печатается количество элементов массивное. Функция 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 в контексте списка
Чть I. :Ei Perl
$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 |