Доступ к файлам
Чтение информации из файла осуществляется операцией о, операндом которой является дескриптор файла. В скалярном контексте при первом выполнении эта операция читает первую запись файла, устанавливая специальную переменную $., отслеживающую количество прочитанных записей, равной 1. Последующие обращения к операции чтения из файла с тем же дескриптором приводят к последовательному чтению следующих записей. В списковом контексте эта операция читает все оставшиеся записи файла и возвращает список, элементами которого являются записи файла. Разделитель записей хранится в специальной переменной $/, и по умолчанию им является символ новой строки "\n". Perl позволяет задать и другой разделитель записей обычной операцией присваивания переменной $/ нового символа разделителя записей. В примере 7.4 демонстрируются некоторые приемы чтения из файла.
#! peri – w open(F1, "in.dat") or die "Ошибка открытия файла: $!"; open(F2, "out.dat") or die "Ошибка открытия файла: $!"; $linel = <F1>; # Первая запись файла in.dat $line2 = <F1>; # Вторая запись файла in.dat @rest = <F1>; # Оставшиеся записи файла in.dat $/=":"; I Задание другого разделителя записей файла @f2 = <F2>; # Печать прочитанных записей файла out.dat for($i=0; $i<=$#f2; $i++) { print "$f2[$i]\n"; } $/ = "\n"; # Восстановление умалчиваемого разделителя записей close(Fl) or die $!; close(F2) or die $!; open(F3, "out.dat") or die "Ошибка открытия файла: $!"; print <F3>; # Печать всего файла close(F3) or die $!;
Несколько комментариев к программе примера 7.4. В переменные $iine1 и $iine2 читаются соответственно первая и вторая строка файла in.dat, так как используется умалчиваемый разделитель записей "\п". Элементы массива @rest хранят строки с третьей по последнюю этого же файла: в операторе присваивания операция чтения <F1> выполняется в списковом контексте.
Перед чтением записей файла out.dat устанавливается новый разделитель записей – символ ":". Если файл out.dat, например, содержит только одну строку:
111: 222: 333: Конец
…то элементы массива @ fг будут содержать следующие значения:
$f2[0] = "111:" $f2[l] = "222:" $f2[2] = "333:" $f2[3] = "Конец"
Замечание
Если при создании файла out.dat его единственная строка завершена переходом на новую строку (нажата клавиша Enter), то $f2[3], будет содержать строку "конец\п".
При достижении конца файла операция о возвращает неопределенное значение, которое трактуется как Ложь. Это обстоятельство обычно используется для организации чтения записей файла в цикле:
while($line = <F1>) { print $line; f Печать очередной строки связанного # с дескриптором F1 файла }
Запись в файл, открытый в режиме записи или добавления, осуществляется функцией print () с первым параметром, являющимся дескриптором файла:
print ДЕСКРИПТОР СПИСОК_ВЫВОДД;
Эта операция записывает содержимое элементов списка в том порядке, в котором они определены в вызове функции, и не добавляет в конец списка разделителя записей. Об этом должен позаботиться сам программист:
$/=":"; # Разделитель записей print Fl @recll, $/; # Запись в файл первой записи print Fl @rec!2, $/; tt Запись в файл второй записи
Замечание
Между дескриптором и первым элементом списка вывода не должно быть запятой. Если такое случится, то компилятор peri выдаст ошибку:
No comma allowed after filehandle