Анимация
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Умирать, так с музыкой

.. Функция die используется в Perl для остановки выполнения программы в случае

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

Died aieBapHR line xxx

Функции die может передаваться список аргументов, которые будут выводиться

вместо стандартного сообщения. Если сообщение не содержит символа перевода

строки, то в его конец добавляется текст at амя сценария line xxx, например: die "Ошибга при открытии файла";

t Вэвэдится ссхэбщение " Ошибка гри сязфыгии файла at имя сцеварвя line XXX" die "Ошибка при откр1тии фааХп"; t Вьюодится " Ошибка при открытии фаа"

В Perl предусмотрена специальная переменная $!, содержащая сообщение об ошибке, возникшей при выполнении последней системной операции (например, операции дискового вода). В числовом контексте конструкция $! возвращает мало что говорящий номер ошибки. В строковом контексте переменная $! возвращает сообщение операционной системы об ошибке, например:

open(MYFILE, "myfile") 11 ie "Ошибка при кр]ти 1е; $!\п";

Если эта функция не сможет открыть файл из-за его отсутствия, будет выведено

сообщение Ошибка при открпии myfile: a file or directory in the path does not exist.

Как видите, все понятно. Подобные сообщения в сильной степени помогают понять,

что произошло, в каком месте программы и в результате выполнения какой операции. Хорошая диагностика неоценима при локализации программных ошибок.

Не используйте переменную $! для проверки успешности выполнения системной функции. Значение этой переменной определено непосредственно после выполнения системной операции (например, ввода-вывода) и только при неудачном завершении этой операции. Во всех остальных случаях переменная $! может иметь совершенно произвольное бессмысленное значение.

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

if {! Open{MYFILE, "output")) {

warn "Ошибка при открытии файла output: $!"; } else {

: t Читаются данн1е файла...

Чтение данных из файла

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

open{MYFILE, "myfile") II die "Опибка.гр огкрьггии rryfile: $1"; $line=<MYFILE>; t Чтение файла

86 Чть I. :Ei



Угловой оператор в скалярном контексте читает одну строку из файла. Если файл заканчивается, угловой онератор возвращает значение undef.


Строкой в текстовом файле называется последовательность символов, ограниченная специальным признаком конца строки. В UNIX таким признаком является символ перевода строки (ASCII-код 10), в DOS и Windows - последовательность символов возврата каретки и перевода строки (ASCII-коды: 13 и 10). Знамение стандартного признака конца" строки может быть изменено в Peri, что позволяет добиться некоторых интересных эффектов. Подробнее об этом речь пойдет на 12-м занятии, "Работа с командной строкой Perl".

Для чтения и вывода содержимого целого файла можно использовать следующий код (в примере предполагается, что MYHE - открытый дескриптор файла):

while {

print $a;

Для чтения информации из файла удобно использовать цикл while. Если в цикле

while вместо условного выражения используется угловой оператор, Perl автоматически присваивает введенную строку специальной переменной $ и повторяет цикл, пока файл не закончится:

while(<MYFILE>) {

print $ ;

При этом на оператор while возлагается присваивание введенной строки переменной $ и проверка признака достижения конца файла. Такое интересное поведение случается только в цикле while и лишь тогда, когда условное выражение состоит из углового


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

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

open(MYFILE, "novel.txt") die "$!";

icontents=<HTFILE>;

close(MYFILE);

В этом примере через дескриптор MYI считываются все данные из файла novel.txt и присваиваются массиву {(contents. При этом первая строка файла novel.txt присваивается первому элементу массива contents: Scontents [ О ]. Вторая строка присваивается $contents[l] и т.д.

В большинстве случаев чтение всего файла в массив (если файл не слишком велик) - наиболее простой способ подготовки данных к дальнейшей обработке. При этом можно легко перемещаться по массиву, манипулировать его элементами и пользоваться всем арсеналом средств для работы с массивами. При этом не нужно беспокоиться о том, что содержимое самого файла может быть случайно испорчено, поскольку работа выполняется над копией этого файла. В листинге 5.1 показаны некоторые возможные манипуляции с файлами в памяти.



5.1. EертDEа соогр фа

3: open(MYFiLE, "testfile") jl die -Ошибка casbindHaimatestfile: $!"; 4:estuff=<HYFILE>; 5: close{HYriLE);

6: f Ате[]УЫ]УСнеу[глзпЕМ1ьпс&В]УВЕж1Я1

7: foreach{reverse(§stuff)) {

8: pdnt scalar (reverse ($ ));

9: }

Поместим в тестовый файл testfile следующий текст:

В лесу родилась елочка, В лесу она росла.

Тогда программа из листинга 5.1 выведет:

ано В ,акчопе ьсалидор усел В

Проведем анализ программы.

• Строка I. В этой строке находится путь к интерпретатору (измените его в

соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим вывода предупреждений!

• Строка 3. Открывается файл testfile, которому назначается дескриптор MYFUE Если файл не может быть корректно открыт, выполняется функция

die, выводящая сообщение об ошибке.

• Строка 4. Все содержимое файла testfile читается в массив gstuf f.

• Строка 5. Поскольку содержимое файла testfile успешно прочитано, файл можно закрыть и освободить дескриптор MYFUE

• Строка 7. Из массива uff создается список с обратным порядком следования

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

• Строка 8. Изменяется порядок следования символов строки файла (которая находится в переменной $ ), после чего выполняется ее печать. Функция scalar в данном случае необходима, так как по умолчанию функция print ожидает получить список, а в контексте списка функция reverse инвертирует порядок следования элементов списка. Поэтому порядок следования символов переменной

остался бы неизменным. Функция scalar определяет скалярный контекст для

функции reverse, изменяющей порядок следования символов в $ .

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

зует всю доступную память системы.

Чть I. :Ei 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122