Как работать с файлами Perl?

ExCergiy
  1. Олег говорит:

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

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

    Есть стандартные файловые манипуляторы Перл. Они называются 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 остановимся немного подробнее. Она получает два параметра — файловый манипулятор и, режым блокировки.

    • 1 совместная блокировка (для чтения)
    • 2 монопольная блокировка (для записи)
    • 4 асинхронный запрос блокировки
    • 8 снятие блокировки

    При завершении процесса блокировка снимается автоматически. Если вы вдруг решили это сделать вручную 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 — с конца файла.

    Это пожалуй все, чем я могу вам помочь.

    «

Добавить комментарий

Войти с помощью: