Анимация
JavaScript
|
Главная Библионтека Умирать, так с музыкой .. Функция 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 |