Анимация
JavaScript
|
Главная Библионтека Формат начала страницы определяется так же, как и всякий другой формат. Имя формата начала страницы для конкретного дескриптора файла по умолчанию состоит из имени этого дескриптора и символов Т0Р (обязательно прописных). Переменная $% в Perl определяется как количество вызовов формата начала страницы для конкретного дескриптора файла, что позволяет использовать эту переменную в составе формата начала страницы для нумерации страниц. Например, добавление следующего определения формата в предыдущий фрагмент программы предотвращает разрыв адресной этикетки на границах страниц и обеспечивает указание текущего номера страницы; format ADDRESSLABEL TOP = My Addresses - Page @< $% Длина страницы по умолчанию - 60 строк. Этот параметр можно изменить, присвоив значение специальной переменной, о которой вы вскоре узнаете. Perl не замечает, если вы выполняете для этого же дескриптора файла функцию print из другого места в программе, вследствие чего число строк, которые можно разместить на текущей странице, уменьшается. Вам следует либо переписать свой код, чтобы с помощью одних и тех же форматов выводить на печать всю информацию, либо после выполнения print изменить переменную "число строк на текущей странице". Через минуту мы увггдим, как можно изменить это значение. Изменение в форматах установок по умолчанию Мы часто говорим об использовании в тех или иных ситуациях значений "по умолчанию". В Perl имеется способ отмены этих "умолчаний" практически для всех случаев. Давайте поговорим об этом. Изменение дескриптора файла с помощью функции select() Когда мы говорили о функции print в главе 6, я упомянул, что print и print stdout идентичны, потому что stdout - это установка по умолчанию для print. Это не совсем так. Настоящая установка по умолчанию для print (а также для write и еще нескольких операций, до которых мы скоро доберемся) - это выбранный в текущий момент дескриптор файла. Вначале выбранный в текущий момент дескриптор файла - это stdout, благодаря чему упрощается отправка данных на стандартный вывод. Изменить выбранный в текущий момент дескриптор файла можно с помощью функции select. В качестве аргумента эта функция принимает отдельный дескриптор файла (или скалярную переменную, которая содержит имя дескриптора файла). Изменение выбранного в текущий момент дескриптора файла влияет на все последующие операции, которые от него зависят. Например: print "hello worldXn"; # аналогично print STDOUT "hello worldXn" select (LOGFILE); # выбрать новый дескриптор файла print "howdy, worldXn"; # аналогично print LOGFILE "howdy, worldXn" print "more for the logXn"; # еще в LOGFILE select (STDOUT); # вновь выбрать STDOUT print "back to stdoutXn"; # это идет на стандартный вывод Отметим, что операция select - "липкая"; после выбора нового дескриптора он остается "выбранным в текущий момент" до проведения следующей операции select. Таким образом, более удачное определение stdout по отношению к функциям print и write будет звучать так: stdout - выбранный в текущий момент дескриптор по умолчанию, или просто дескриптор по умолчанию. В подпрограммах может возникать необходимость смены выбранного в текущий момент дескриптора файла. Представляете, какое неприятное чувство можно испытать, вызвав подпрограмму и обнаружив, что все тщательно проверенные строки текста уходили куда-то "налево", потому что подпрограмма, оказывается, изменила выбранный в текущий момент дескриптор файла и не восстановила его! Что же должна делать "хорошо воспитанная" подпрограмма? Если она "знает", что текущий дескриптор - stdout, она может восстановить выбранный дескриптор с помощью кода, похожего на приведенный выше. А если программа, которая вызвала подпрограмму, уже изменила выбранный дескриптор файла - что тогда? Оказывается, значение, возвращаемое функцией select, - это строка, которая содержит имя ранее выбранного дескриптора. Получив данное значение, можно впоследствии восстановить этот дескриптор, используя такой код: Soldhandle = select LOGFILE; print "this goes to LOGFILEXn"; select (Soldhandle); # восстановить предыдущий дескриптор Действительно, в приведенных выше примерах гораздо проще в качестве дескриптора файла для print явным образом указать logfile, но некоторые операции, как мы вскоре увидим, требуют именно изменения выбранного в текущий момент дескриптора файла. Из.менение имени формата Имя формата по умолчанию для конкретного дескриптора файла совпадает с именем этого дескриптора. Для выбранного в текущий момент дескриптора файла этот порядок можно изменить, присвоив новое имя формата специальной переменной $~. Можно также проверить значение этой переменной и посмотреть, каков текущий формат для выбранного в текущий момент дескриптора файла. Например, чтобы использовать формат addresslabel с дескриптором stdout, следует просто записать: $~ = ".IDDRESSLABEL"; А что, если нужно установить для дескриптора report формат summary? Для этого необходимо сделать всего лищь следующее: $oldhanlde = select REPORT; $~ = "SUMMARY"; select (?oldhandle); Когда в следующий раз мы напишем write (REPORT); to тем самым передадим текст на дескриптор report, но в формате summary*. Обратите внимание на то, что вы сохранили предыдущий дескриптор в скалярной переменной, а затем восстановили его. Этот прием - признак хорошего стиля программирования. В коде реальной программы мы, вероятно, решили бы предыдущий однострочный пример таким же способом, а не предполагали бы, что stdout - дескриптор по умолчанию. Изменяя текущий формат для конкретного дескриптора файла, вы можете чередовать в одном отчете много разных форматов. Изл1енение имени форлшта начала страницы Точно так же, как путем установки переменной $~ мы можем изменять имя формата для конкретного дескриптора файла, так путем установки переменной $ мы можем менять формат начала страницы. Эта переменная содержит имя формата начала страницы для выбранного в текущий момент дескриптора файла и доступна для чтения и записи, т.е. вы можете проверить ее значение и узнать текущее имя формата, а также изменить его, присвоив этой переменной новое значение. Объектно-ориентированный модуль FileHandle, входящий в состав стандартного дистрибутива Perl, обеспечивает выполнение этой задачи более простым способом. 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 |