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

в результате такого присваивания изменяется та часть строки, которая была бы возвращена, будь substr использована не в левой, а в правой части выражения. Нопример, substr ($var, З, 2) возвращает четвертый и пятый символы (начиная с 3 в количестве 2), поэтому присваивание изменяет указанные два символа в $var подобно тому, как это приведено ниже:

$hw = "hello world";

substr{$hw, 0, 5) = "howdy"; # $hw теперь равна "howdy world"

Длина заменяющего текста (который присваивается функции substr) не обязательно должна быть равна длине заменяемого текста, как в этом примере. Строка автоматически увеличивается или уменьшается в соответствии с длиной текста. Вот пример, в котором строка укорачивается:

substr($hw. О, 5) = "hi"; # $hw теперь равна "hi world"

В следующем примере эта строка удлиняется:

substr($hw, -6, 5) = "nationwide news"; # заменяет "world"

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

Форматирование данных с помощью функции sprintf()

Функция printf оказывается удобной, когда нужно взять список значений и создать выходную строку, в которой эти значения отображались бы в заданном виде. Функция sprintf использует такие же аргументы, как и функция printf, но возвращает то, что выдала бы printf, в виде одной строки. (Можете считать ее "строковой функцией printf".) Например, чтобы создать строку, состоящую из буквы X и значения переменной $у, дополненного нулями до пяти разрядов, нужно записать:

$result = sprintf ("X%05d",$у);

Описание аргументов функции sprintf вы найдете в разделе sprintf главы 3 книги Programming Perl и на тап-странице printf(3) (если она у вас есть).



Сортировка по заданным критериям

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

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

Программа сравнения определяется как обычная подпрограмма. Она будет вызываться многократно, и каждый раз ей будут передаваться два аргумента сортируемого списка. Данная подпрограмма должна определить, как первое значение соотносится со вторым (меньше, равно или больше), и возвратить закодированное значение (которое мы опишем чуть ниже). Этот процесс повторяется до тех пор, пока не будет рассортирован весь список.

Чтобы повысить скорость выполнения, эти два значения передаются в подпрограмму не в массиве, а как значения глобальных переменных $а и $Ь. (Не волнуйтесь: исходные значения $а и $Ь надежно защищены.) Эта подпрограмма должна возвратить любое отрицательное число, если $а меньше $Ь, нуль, если $а равно $Ь, и любое положительное число, если $а больше $Ь. Теперь учтите, что "меньше чем" соответствует вашему пониманию этого результата в данном конкретном случае; это может быть сравнение чисел, сравнение по третьему символу строки, наконец, сравнение по значениям какого-то хеша с использованием передаваемых значений как ключей - в общем, это очень гибкий механизм.

Вот пример подпрограммы сортировки в числовом порядке:

sub by number {

if {$а < $b) (

return -1; } elsif ($a == $b) (

return 0; ) elsif ($a > $b) {

return 1;

Обратите внимание на имя by number. На первый взгляд, в имени этой подпрограммы нет ничего особенного, но скоро вы поймете, почему нам нравятся имена, которые начинаются с префикса Ьу .

Давайте разберем эту подпрограмму. Если значение $а меньше (в данном случае в числовом смысле), чем значение $Ь, мы возвращаем значение -1.



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

Как использовать данную программу? Давайте попробуем рассортировать такой список:

Osomelist = (1,2, 4, 8,16,32, 64, 128,256);

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

(3wronglist = sort (Osomelist; # (wronglist теперь содержит (1, 128, 16, 2, 256, 32, 4, 64, 8)

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

(3rightlist = sort by nuinber (3wronglist;

# (rightlist теперь содержит (1, 2, 4, 8, 16, 32, 64, 128, 256)

Задача рещена. Обратите внимание: функцию sort можно прочитать вместе с ее спутницей, программой сортировки, на человеческом языке, т.е. "рассортировать по числовым значениям". Вот почему мы использовали в имени подпрограммы префикс Ьу ("по").

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

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

sub by number ( $а <=> $b;

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

(arightlist = sort ( $а <=> $b } (awronglist;



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