Для открытия файла использ функция open (): open(переменная,"[способ открытия]путь к файлу");
Под переменной впоследствии будет пониматься символьное обозначение файла.
Способов открытия для файла несколько. Наиболее важными являются:
open(myfile,"[<]myfile"); # Открыть файл для чтенияopen(myfile,">myfile”); # Открыть файл для записиopen(myfile,">>myfile”); # открыть файл для дозаписиopen(myfile,"+>myfile”); open(myfile,"+<myfile”); open(myfile,"+>>myfile”); #Открыть файл для чтения и записиЗапись информации в файл, открытый в режиме записи, осуществляется в начало файла, что приводит к уничтожению содержащейся в нем до его открытия информации. Информация, содержащаяся в файле, открытом в режиме добавления, не уничтожается, новые записи добавляются в конец файла. Если при открытии файла в режиме записи или добавления не существует файла с указанным именем, то он создается, что отличает эти режимы открытия файла от режима чтения, при котором файл должен существовать. В противном случае операция открытия завершается с ошибкой.
Различия между тремя режимами чтения/записи +<, +> и +>>: первый и третий режимы сохраняют содержимое открываемого файла, тогда как открытие файла с использованием второго режима (+>) сначала очищает содержимое открываемого файла. Третий режим отличается от первых двух тем, что запись в файл всегда осуществляется в конец содержимого файла.
При открытии файла функции open возвращают не нулевое значение, если открытие файла с заданным режимом произошло успешно, и неопределенное значение undef в противном случае. Всегда следует проверять успешность выполнения операции открытия файла, прекращая выполнение программы функцией die (). Эта функция отображает список передаваемых ей параметров и завершает выполнение сценария Perl: open(FF, "+< $file") or die "Нельзя открыть файл!";
|
В программах следует избегать работы с одним файлом через несколько дескрипторов-копий.
По завершении работы с файлом он закрывается функцией close (). Единственным необязательным параметром этой функции является дескриптор, ассоциированный с файлом: close ДЕСКРИПТОР;
Эта функция возвращает значение Истина, если успешно очищен буфер ввода/вывода и закрыт системный дескриптор файла. Вызванная без параметра, функция close закрывает файл, связанный с текущим дескриптором, установленным функцией select().
Закрывать файлы в программе функцией close() не обязательно. Открытие нового файла с дескриптором, уже связанным с каким-либо файлом, закрывает этот старый файл. Более того, при завершении программы все открытые в ней файлы закрываются. Но такое неявное закрытие файлов таит в себе потенциальные ошибки из-за невозможности определить, завершилась ли эта операция корректно. Может оказаться, что при записи в файл переполнится диск, или будет разорвана связь с удаленным устройством вывода. Подобные ошибки можно "отловить", если использовать явное закрытие файла и проверять содержимое специальной переменной $! (сообщение ОС об ошибке): Close(FILEIO) or die "Ошибка закрытия файла: $!";
При чтении из файла специальная переменная $. хранит номер последней прочитанной записи файла. При явном закрытии файла функцией close значение этой переменной обнуляется, тогда как при неявном закрытии оно остается равным номеру последней прочитанной записи старого файла и продолжает увеличиваться при операциях чтения из нового файла.
|
Чтение информации из файла осуществляется операцией <>, операндом которой является дескриптор файла. В скалярном контексте при первом выполнении эта операция читает первую запись файла, устанавливая специальную переменную $. равной 1. Последующие обращения к операции чтения из файла с тем же дескриптором приводят к последовательному чтению следующих записей. В списковом контексте эта операция читает все оставшиеся записи файла и возвращает список, элементами которого являются записи файла. Разделитель записей хранится в специальной переменной $/, и по умолчанию им является символ новой строки "\n". Perl позволяет задать и другой разделитель записей обычной операцией присваивания переменной $/ нового символа разделителя записей.
#! perl -w
open(F1, "in.dat") or die "Ошибка открытия файла: $!";
open(F2, "<out.dat") or die "Ошибка открытия файла: $!";
$line1 = <F1>; # Первая запись файла in.dat
$line2 = <F1>; # Вторая запись файла in.dat
@rest = <F1>; # Оставшиеся записифайла in.dat
$/=":"; # Задание другого разделителя записей файла
@f2 = <F2>;
for($i=0; $i<=$#f2; $i++) { print "$f2[$i]\n"; # Печать прочитанных записей файла out.dat
} $/ = "\n"; # Восстановление умалчиваемого разделителя записей
close(F1) or die $!; close(F2) or die $!;
При достижении конца файла операция <> возвращает неопределенное значение, которое трактуется как Ложь. Это обстоятельство обычно используется для организации чтения записей файла в цикле:
while($line = <F1>) {print $line; # Печать очередной строки связанного с дескриптором F1 файла }
|
Запись в файл, открытый в режиме записи или добавления, осуществляется функцией print () с первым параметром, являющимся дескриптором файла: print ДЕСКРИПТОР СПИСОК_ВЫВОДА;
open(myfile,">myfile.txt"); print myfile "Текст в файле!"; close(myfile);
Эта операция записывает содержимое элементов списка в том порядке, в котором они определены в вызове функции, и не добавляет в конец списка разделителя записей. Об этом должен позаботиться сам программист:
$/=":"; # Разделитель записей
print F1 @rec1, $/; # Запись в файл первой записи
print F1 @rec2, $/; # Запись в файл второй записи
Файлы в Perl интерпретируются как неструктурированные потоки байтов. При работе с файлом через дескриптор отслеживается его текущая позиция. Операции чтения/записи выполняются с текущей позиции файла. Для определения текущей позиции в файле используется функция tell (), единственным параметром которой может быть дескриптор файла. Она возвращает текущую позицию в связанном с дескриптором файле. Эта же функция без параметра возвращает текущую позицию в файле, для которого была в программе выполнена последняя операция чтения.
Текущая позиция в файле автоматически изменяется в соответствии с выполненными операциями чтения/записи. Ее можно изменить с помощью функции seek (). Для связанного с дескриптором файла устанавливается новая текущая позиция, смещенная на заданное параметром СМЕЩЕНИЕ число байт относительно точки отсчета: seek ДЕСКРИПТОР, СМЕЩЕНИЕ, ТОЧКА_ОТСЧЁТА;
Параметр ТОЧКА_ОТСЧЁТА может принимать одно из трех значений: 0 — начало файла, 1 — текущая позиция, 2 — конец файла. Смещение может быть как положительным, так и отрицательным. Обычно оно отрицательно для смещения относительно конца файла и положительно для смещения относительно начала файла. Для задания точки отсчета можно воспользоваться константами SEEK_SET, SEEK_CUR и SEEK_END из модуля Seekable, которые соответствуют началу файла, текущей позиции и концу файла. Естественно, необходимо подключить этот модуль к программе с помощью ключевого слова use.
seek FILE1, 5, 0; seek FILE2, 5, SEEK_SET;
Для перехода в начало или в конец файла следует использовать нулевое смещение относительно соответствующих точек отсчета при обращении к функции seek ():
seek FILE1, 0, 0; # Переход в начало файла seek FILE1, 0, 2; # Переход в конец файла
Кроме операции чтения записей файла <>, существуют еще два способа чтения из файла: функции getc () и read (). Первая читает один байт из файла, вторая читает записи фиксированной длины.
Функция getc возвращает символ в текущей позиции файла, дескриптор которого передан ей в качестве параметра, или неопределенное значение в случае достижения конца файла или возникновении ошибки. Если функция вызывается без параметра, то она читает символ из стандартного файла ввода STDIN.
getc; # Чтение символа из STDIN getc F1; # Чтение символа в текущей позиции файла F1
Функция read (): read ДЕСКРИПТОР, ПЕРЕМЕННАЯ, ДЛИНА [,СМЕЩЕНИЕ];
Она читает количество байтов, определенное значением параметра ДЛИНА, в скалярную переменную, определяемую параметром ПЕРЕМЕННАЯ, из файла с дескриптором, заданным первым параметром ДЕСКРИПТОР. Возвращаемое значение — действительное количество прочитанных байтов, 0 при попытке чтения в позиции конца файла и неопределенное значение в случае возникновения ошибки. Параметр СМЕЩЕНИЕ определяет количество сохраняемых байтов из содержимого переменной ПЕРЕМЕННАЯ, т. е. запись прочитанных из файла данных будет добавлена к содержимому переменной после байта, определяемого значением параметра СМЕЩЕНИЕ. Отрицательное значение смещения -N означает, что из содержимого переменной ПЕРЕМЕННАЯ отбрасываются последние N байтов и к оставшейся строке добавляется запись, прочитанная из файла.
#! peri -w #Файл in.dat содержит три строки данных: One Two Three
open(F1, "in.dat") or die "Ошибка открытия файла: $!";
$string = "1234567890";
read F1, $string, 6; #Чтение шести байт в переменную без смещения
print $string,"\n"; # $string = "One\nTw"
read F1, $string, 6, length($string);
print $string,"\n"; # $string = "One\nTwo\nThre"
Функция length() возвращает количество символов (байтов) в строковых данных, хранящихся в скалярной переменной, переданной ей в качестве параметра. После выполнения первой операции чтения содержимое переменной $string было уничтожено, так как эта функция read() вызывалась без смещения. При втором чтении хранившиеся данные в переменной $string были сохранены.