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

функции shift и unshift

Функции push и pop действуют в "правой" части списка (части со старшими индексами). Функции unshift и shift выполняют соответствую-шие действия в "левой" части списка (части с младшими индексами). Вот несколько примеров:

unshift (@f red, $а) ; # соответствует Of red = ($a,@fred),-

unshift(@fred,$a,$b,$c); # соответствует @fred = ($a,$b,$c,@fred); $x = shift(@fred); # соответствует ($x,@fred) = @fred;

# с реальньми значениями

@fred = (5, 6, 7) ;

unshift (@fred,2,3,4); # @fred теперь имеет значение (2,3,4,5,6,7)

$x = shift (l?fred) ;

# $x получает значение 2, gfred теперь имеет значение (3,4,5,6,7)

Как и функция pop, функция shift, если в нее ввести пустую переменную-массив, возврашает значение undef.

Функция reverse

Функция reverse изменяет порядок следования элементов аргумента на противоположный и возврашает список-результат. Например:

@а = (7,8, 9) ;

@Ь = reverse ((За) ; # присваивает @Ь значение (9,8,7)

@Ь = reverse(7,8,9); # делает то же самое

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

@Ь = reverse(@Ь); # присвоить массиву @Ь его же значения,

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

Функция sort

функция sort сортирует аргументы так, как будто это отдельные строки, в порядке возрастания их кодов ASCII. Она возвращает отсортированный список, не изменяя оригинал. Например:

@х = sort("small","medium","large");

# l?x получает значение "large", "medium", "small" @y = (1, 2, 4, 8, 16, 32, 64) ;

@Y = sort (@y); # @y получает значение 1, 16, 2, 32, 4, 64, 8

Отметим, что сортировка чисел производится не по их числовым значениям, а по их строковымпредставлениям (1, 16, 2, 32 и т.д.). Изучив главу 15, вы научитесь выполнять сортировку по числовым значениям, по убыванию, по третьему символу строки и вообще каким угодно методом.

84 Ияуиае.м Perl



функция chomp

Функция chomp работает не только со скалярной переменной, но и с массивом. У каждого элемента массива удаляется последний пробельный символ. Это удобно, когда вы, прочитав несколько строк как список отдельных элементов массива, хотите одновременно убрать из всех строк символы новой строки. Например:

gstuff = ("helloXn","world\n","happy days");

chomp(@stuff); # @stuff теперь имеет значение ("hello","world","happy day")

Скалярный и списочный контексты

Как видите, каждая операция и функция предназначена для работы с определенной комбинацией скаляров или списков и возвращает скаляр или список. Если операция или функция рассчитывает на получение скалярного операнда, то мы говорим, что операнд или аргумент обрабатывается в скалярном контексте. Аналогичным образом, если операнд или аргумент должен быть списочным значением, мы говорим, что он обрабатывается в списочном контексте.

Как правило, это особого значения не имеет, но иногда в разных контекстах можно получить совершенно разные результаты. Например, в списочном контексте @freci возвращает содержимое массива @fred, а в скалярном - размер этого массива. При описании операций и функций мы упоминаем эти тонкости.

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

<STDIN> как массив

Одна из ранее изученных нами операций, которая в списочном контексте возвращает иное значение, чем в скалярном, - <stdin>. Как упоминалось выше, <STDiN> в скалярном контексте возвращает следующую введенную строку. В списочном же контексте эта операция возвращает все строки, оставшиеся до конца файла. Каждая строка при этом возвращается как отдельный элемент списка, например:

$а = <STDIN>; # читать стандартный ввод в списочном контексте

Если пользователь, выполняющий программу, введет три строки и нажмет [Ctrl+D]* (чтобы обозначить конец файла), массив будет состоять из трех элементов. Каждый из них является строкой, заканчивающейся символом новой строки, и соответствует введенной пользователем строке.

* в некоторых системах конец файла обозначается нажатием клавиш [Ctii+Z], а в других эта комбинация служит для приостановки выполняемого процесса.



Интерполяция массивов

Как и скаляры, значения массивов могут интерполироваться в строку, заключенную в двойные кавычки. Каждый элемент массива заменяется его значением, например:

@fred = ("hello","dolly"); $У = 2;

$х = "This IS $fred[l]s place"; # "This is dollys place"

$x = "This IS $fred[$y-l]s place"; # To же самое

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

Если вы хотите поставить после простой ссылки на скалярную переменную литеральную левую квадратную скобку, нужно выделить эту скобку так, чтобы она не считалась частью массива:

@fred = ("hello","dolly"); # присвоить массиву gfred значение для проверки Sfred = "right";

# мы пытаемся сказать "this is right[1]" $х = "this IS $fred[l]"; # неправильно, дает "this is dolly" $x = "this IS ${fred}[l]"; # правильно (защищено фигурными скобками) $х = "this IS $fred"."[1]"; # правильно (другая строка)

$х = "this IS $fred\[l]"; # правильно (скобку защищает обратная косая)

Аналогичным образом может интерполироваться список значений переменной-массива. Самая простая интерполяция - интерполяция всего массива, обозначенного именем (с начальным символом @). В этом случае элементы интерполируются по очереди, с разделением их пробелами, например:

@fred = ("а","bb","ссс",1,2,3); $all = "Now for gfred here";

# $all получает значение "Now for a bb ccc 12 3 here"

Можно также выбрать часть массива с помощью среза:

@fred = ("а","bb","ссс",1,2,3); $all = "Now for @fred[2,3] here";

# $all получает значение "Now for ccc 1 here" $all = "Now for @fred[@fred[4,5]] here"; # то же самое

Опять-таки, если вы хотите поставить после ссылки на имя массива литеральную левую квадратную скобку, а не индексное выражение, можете использовать любой из описанных выше механизмов.



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