Анимация
JavaScript
|
Главная Библионтека Пустой список (список, не содержащий элементов) представляется пустой парой круглых скобок: о # пустой список (нуль элементов) Элемент списочного литерала может включать операцию конструктора списка. Это два скалярных значения, разделенных двумя точками. Данная операция создает список значений, начиная с левого скалярного значения и кончая правым скалярным значением, с шагом 1. Например: (1 .. 5) # то же самое, что (1, 2, 3, 4, 5) (1.2 .. 5.2) # то же самое, что (1.2, 2.2, 3.2, 4.2, 5.2) (2 .. 6,10,12) # то же самое, что (2,3,4,5,6,10,12) (5а .. $Ь) # диапазон, заданный текущими значениями переменных Sa и 5Ь Если правый скаляр меньше левого, то список будет пустым, так как в обратном направлении отсчет вести нельзя. Если последнее значение не соответствует целому числу шагов, то список заканчивается там, где приращение на единицу привело бы к появлению числа, не принадлежащего заданному диапазону: (1.3 ., 6.1) # то же самое, что (1.3,2.3,3.3,4.3,5.3) Списочные литералы с множеством коротких текстовых строк со всеми этими кавычками и запятыми выглядят не очень привлекательно: (За = ("fred", "barney", "betty", "wilraa") ; # уф-ф! Поэтому предусмотрена функция заключения в кавычки, которая создает список из разделенных пробелами слов, заключенных в круглые скобки*: (За = qw(fred barney betty wilma); # так-то лучше! (За = qw ( fred barney betty v;i]ma ); # TO же самое Одно из возможных применений списочного литерала - в качестве аргумента функции print, с которой мы уже знакомы. Элементы списка выводятся на экран без промежуточных пробельных символов: print("The answer is ",5a,"\n"); # трехэлементный списочный литерал Этот оператор выводит на экран слова The answer is, затем пробел, значение переменной $а и символ новой строки. Другие способы использования списочных литералов мы рассмотрим позднее. * Как и в функциях сопоставления с образцом, о которых мы узнаем позже, в качестве разделителя здесь вместо круглых скобок можно использовать любой си.мвол, не относящийся к числу пробельных символов, букв и цифр. 78 H:uriae.v Pert Переменные Переменная-массив содержит одно значение в виде списка (нуль или более скалярных значений). Имена переменных-массивов похожи на имена скалярных переменных. Единственное отличие состоит в первом символе - это не знак доллара ($), а знак @. Например: @fred # массив-переменная @fred @А Very Long Array Variable Name @А Very Long Array Variable Name that is different Отметим здесь, что переменная-массив @fred не имеет никакого отношения к скалярной переменной $fred. Для разных типов переменных Perl предусматривает отдельные пространства имен. Переменная-массив, которой еше не присвоено значение, имеет значение ( ), т.е. пустой список. Выражение может ссылаться на переменные-массивы в цело\г, а также проверять и изменять отдельные элементы таких массивов, Операции над массивами и функции обработки массивов Операции над массивами и функции обработки массивов манипулируют целыми массивами. Некоторые из них возвращают список, который затем можно использовать как значение в другой функции обработки массивов или присвоить переменной-массиву. Присваивание Вероятно, самая важная операция, проводимая над массивами - операция присваивания, посредством которой переменной-массиву присваивается значение. Эта операция, как и скалярная операция присваивания, обозначается знаком равенства. Perl определяет тип присваивания (скалярное или для массива), анализируя, какой переменной присваивается значение - скалярной или массиву. Например: @fred = (1,2,3); # массив fred получает трехэлементное литеральное значение (ЗЬагпеу = @fred; # теперь оно копируется в (ЗЬагпеу Если переменной-массиву присваивается скалярное значение, оно становится единственным элементом этого массива: @huh =1; #1 автоматически становится списком (1) Имена переменных-массивов могут входить в списочный литерал. При вычислении значений такого списка Perl заменяет имена массивов текущими значениями, например: gfred = qw(one two); Obarney = (4,5,@fred,6,7); # @barney превращается в (4,5,"one","two",6,7) Obarney = (8,@barney); # в начале списка элементов @barney ставится 8 # и "last" в конце. @Ъагпеу = (@barney,"last"); # @barney превращается в # (8,4,5, "one", "two",6,7,"last") Отметим, что вставленные подобным образом элементы массива находятся на том же уровне иерархии, что и остальная часть литерала: список не может содержать другой список в качестве элемента*. Если списочный литерал содержит только ссылки на переменные (а не выражения), то этот литерал также можно рассматривать как переменную. Другими словами, такой списочный литерал можно использовать в левой части операции присваивания. Каждая скалярная переменная в списочном литерале принимает соответствующее значение из списка, стоящего в правой части операции присваивания. Например: (5а,$Ъ,$с) - (1,2,3); # присвоить 1 переменной Sa, 2 - переменной Sb, # 3 - переменной $с (Sa,Sb) = (Sb,Sa); # поменять местами Sa и Sb (Sd,(3fred) - (Sa,Sb,Sc) # присвоить Sd значение Sa, а (Sfred - значение ($b,$c) (Se,(3fred) = (Sfred; # переместить первый элемент массива (Sfred # в переменную $е. В результате (Sfred = (Sc) , # а Se = Sb Если число присваиваемых элементов не соответствует числу переменных, то лишние значения (стоящие справа от знака равенства) просто отбрасываются, а все лишние переменные (слева от знака равенства) получают значение undef. Переменная-массив, входящая в литеральный список, должна стоять в нем последней, потому что переменные-массивы очень "прожорливы" и поглощают все оставшиеся значения. (Конечно, после нее можно поставить и другие переменные, но всем им будет присвоено значение undef.) Если переменная-массив присваивается скалярной переменной, то присваиваемое число является размером массива, например: (3fred = (4,5,6) ; # инициализация массива (3fred $а = @fred; # Sa получает значение 3, текущий размер массива (Sfred Размер возвращается и в том случае, если имя переменной-массива используется там, где должно быть скалярное значение. (В разделе "Скалярный и списочный контексты" мы увидим, что это называется использованием имени * Хотя ссыжа на список и может быть элементом списка, на самом деле это не оз::ачает использование списка в качестве элемента другого списка. Впрочем, работает это почти так же, что позволяет создавать многомерные массивы См главу 4 книги Programming Perl и man-страницу perllol(\) 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 |