Как работать с файлами Perl?
Вопросы Лимит по процентам для займа сотруднику организации
Вопросы Спортивная гимнастика и акробатика для детей: развитие тела и духа
Вопросы ДПК для забора и террасы: преимущества использования и особенности
Вопросы Топ-10 популярных групповых программ: отбор, контроль, мотивация
Вопросы Использование различных снарядов и оборудования в тренировках
Вопросы Приморская таможня конфисковала крупную партию гель-лаков, ввезенных под видом бытовой техники
Вопросы Что такое страх?
Вопросы Окна ПВХ от VEKA: преимущества
Для начала следует разобраться, что такое файловые манипуляторы.
Доступ к файлам осуществляется с помощью файловых манипуляторов, которые представляют собой в некотором смысле ссылку в памяти на файл. Но, тем не менее, они не являются переменными, а поэтому их нельзя непосредственно присваивать другим переменным или передавать в функции (для этого нужно действовать другими способами, которые я сейчас опишу).
Есть стандартные файловые манипуляторы Перл. Они называются STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (стандартный поток ошибок). Например параметры скрипту из формы передаются именно через STDIN (при условии использования метода POST).
Если понадобится создать копию файлового манипулятора (не файла, а только манипулятора по которому осуществляется доступ к файлу), то можно воспользоваться функцией open (о ней подробнее поговорим позже).
Пример:
open(FILL,»file.txt»);
open(FAIL,»lt;amp;FILL»);
О присваивании переменным файловых манипуляторов:
$handle=*FILL;
или передать его в функцию:
some_sub(*FILL);
Кстати, файловые манипуляторы в Perl используются не только для связи с, собственно, файлом. Они могут быть связаны с, например, сокетом.
Манипуляции с файлом
Открывать файл можно с помощью функции open:
open(FFF,»gt; file.txt»);
«У функции есть три параметра, которые вы должны указать: FFF ndash; задаеться название файлового манипулятора, «gt;» ndash; режым доступа, и на конец «file.txt» — имя нужного вам файла. Есть три режима доступа, которые обычно используються: «gt;» — запись,»lt;»- чтение, «gt;gt;»- добавление в файл.
Есть еще более сложная функция sysopen. Но, зато с ее помощью вы задаете большее количество параметров (таким образом лучше laquo;обьясняяraquo; системе, что вы собираетесь делать).
В sysopen три обязательных параметра, как и в open, но есть и один необязательный.
Например:
sysopen(FH,$name, $flags, $param);
FH -указываете файловый манипулятор, $name — имя файла в чистом виде (без «gt;» и др.). В $flags помещаем число, полученное объединением нижеописанных констант через OR ( | ):
O_RDONLY
Только для чтения
O_WRONLY
Только для записи
O_RDWR
Для чтения и для записи
O_CREAT
Если файла нет, создать!
O_APPEND
Открытие в режиме присоединения
O_TRUNC
Очищаем содержимое при открытии
Здесь не полный их перечень, но, как правило, их вполне достаточно, так как они используються чаще всего.
И наконец $param ndash; не обязательный параметр. Он параметр задает маску доступа к файлу и записывается в восьмеричной системе. Обычно используется значение, что обозначает обычный файл — 0666 (значение по умолчанию, то есть если $param опущен), или 0777, когда имеется ввиду каталог либо иполняемый файл ..
Пример:
sysopen(FH,»data.txt»,O_WRONLY|O_TRUNC|O_CREATE);
Этот пример показывает, как открыть файл для записи , что будет создан при указании несуществующего.
Запись в файл делаем функцией print.
print(FFF «Моя первая запись в файл!»);
Здесь FFF — имя файлового манипулятора, а второй параметр (строка в кавычках) — текст, который мы хотим записать в файл, манипулятор которого указан первым параметром FFF.
Если до попытки открытия файла не существовало, то функция open его создаст, а если файл был, и он был не пустой, то функция print удалит все, что в нем было до записи.
Указание файлового манипулятора не является обязательным для функции print. Если вы его не указали, то эта функцыя осуществит вывод в STDOUT (то же относится к функциям printf и write). Чтобы изменить направление вывода в Perl предусмотрена функция select (правда не только для этого). Пример:
open(F1,»gt; one.txt»);
print «Файл открыт! Пишем в STDOUT.»;
$old_point=select(F1);
print «Пишем в файл one.txt»;
select($old_point);
print «Снова пишем в STDOUT.»;
close(F1);
Закрываем файл функцией close.
close(FFF);
Хотя при завершении процесса, в котором был открыт данный файл, файл закрывается автоматически, все же, рекомендуется придерживаться порядка и закрывать файл этой процедурой после завершения работы с ним.
Блокировка файла
Если несколько процессов одновременно пытаются получить доступ к файлу, особенно для записи, то это может привести к серьёзным ошибкам и сбоям. Поэтому нужен механизм блокировки» файлов, который не дает пользоваться файлом всем процессам одновременно, а как бы ставит их в очередь. Делаем так:
open(FIL,»gt; file.dat»);
flock(FIL,2);
close(FIL);
О функциях open и close я уже говорил, а на flock остановимся немного подробнее. Она получает два параметра — файловый манипулятор и, режым блокировки.
При завершении процесса блокировка снимается автоматически. Если вы вдруг решили это сделать вручную ndash; будьте осторожны, так как вы разрешаете любому другому процессу делать с файлом что угодно.
Работа со строками в файле
Строковые файлы — пожалуй самый удобный способ хранить информацию на компьютере имея при этом доступ к находящейся в нем информации в любой момент.
Для чтения строк из файла используется файловый манипулятор «поставленный» в lt;gt;, как в следующей конструкции:
open(FIL,»data.txt»);
while(lt;FILgt;)
{
# делаем что-то с каждой строкой файла
}
Внутри подобного цикла используется стандартная переменная «$_», а номер строки записывается в «$.». Конец строки как правило обозначается специальным символом «»n». Можно его отрезать функцией chomp.
open(FIL,»data.txt»);
while(lt;FILgt;)
{
chomp;» # отрезается спецсимвол от переменной $_
print;» # пишем $_ на STDOUT
}
Можно прочитать строки в массив:
@strings=lt;FILgt;;
foreach $line (@strings)
{
print $list;
}
Для передвижения по файлу используются функции tell и seek.
open(FIL,»data.txt»);
$position=tell(FIL);
print «Текущая позиция в файле $position. n»;
seek(FIL,$position+10,1);
print «А теперь переместились на 10 байт к концу файла от текущей позиции. n»;
$position=tell(FIL);
print «Теперь текущая позиция в файле $position. n»;
Результат:
Текущая позиция в файле 0.
А теперь переместились на 10 байт к концу файла.
Теперь текущая позиция в файле 10.
Функция tell в качестве параметра принимает файловый манипулятор. А что касается seek, то она берет три параметра. Файловый манипулятор, смещение в байтах, направление смещения: 0 — от начала файла, 1 — от текущей позиции, 2 — с конца файла.
Это пожалуй все, чем я могу вам помочь.
«