Титульная страница
ISO 9000 ISO 14000 Forum
Титульная страница
Цель системы качества
Управление качеством
ISO
ISO 9000
ISO 13485
ISO 14000
ISO 17025
OHSAS 18001
ISO 19011
Total Quality Management
Project Management
Фармацевтика
Отраслевые стандарты
Информационные технологии
Оформление документации
Ссылки 
Поиск на сайте
Forum
Реклама на сайте





Работаем с файлами на Perl

О том, что такое файл писать я надеюсь ненужно, но думаю нужно подумать над тем, что с ними можно делать, как видно из заголовка статьи, на Perl. Ну, приступим . . .

В этой статье обсудим:

  • Что такое файловые манипуляторы, и с чем их едят
  • Манипуляции с файлом
  • Работа со строками в файле

    Что такое файловые манипуляторы, и с чем их едят

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

    Есть и стандартные Перловские файловые манипуляторы. Они называются STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (стандартный поток ошибок). Например параметры скрипту из формы передаются именно через STDIN (при условии использования метода POST).

    Если понадобится создать копию файлового манипулятора (не файла, а только манипулятора по которому осуществляется доступ к файлу), то можно воспользоваться функцией open (о ней подробнее поговорим позже).

    Пример:
    open(FILL,"file.txt");
    open(FAIL,"<&FILL");
    

    О присваивании переменным файловых манипуляторов:

    $handle=*FILL;
    или передать его в функцию:
    some_sub(*FILL);
    

    И под конец скажу, что файловые манипуляторы в Perl используются не только для связи с, собственно, файлом. Они могут быть связаны с каким-нибудь процессом, сокетом и т.д. Но это не входит в тематику статьи.

    Манипуляции с файлом

    Открытие файла осуществляется функцией open.

    open(FFF,"> file.txt");

    Разберемся. У функции три параметра: FFF - название файлового манипулятора (его задаете вы), режим доступа ">" и "file.txt" - имя нужного вам файла. Есть три основных режима: ">" - запись,"<"- чтение, ">>"- добавление в файл.

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

    В sysopen три обязательных параметра и один необязательный.

    Например:
    sysopen(FH,$name, $flags, $param);
    

    FH - собственно, файловый манипулятор, $name - имя файла в чистом виде (без ">" и др.). В $flags помещаем число, полученное объединением нижеописанных констант через OR ( | ):
    O_RDONLY Только для чтения
    O_WRONLY Только для записи
    O_RDWR Для чтения и для записи
    O_CREAT Если файла нет, создать!
    O_APPEND Открытие в режиме присоединения
    O_TRUNC Очищаем содержимое при открытии

    Это, конечно, не полный перечень, но здесь перечислены самые необходимые и часто используемые константы.

    И наконец $param. Этот параметр задает маску доступа к файлу и записывается в восьмеричной системе. Обычно используется значение 0666 (значение по умолчанию, то есть если $param опущен), или 0777. Первое значение используется для обычных файлов, второе же для каталогов и исполняемых файлов.

    Пример открытия файла для записи (если не найден - создается):

    sysopen(FH,"data.txt",O_WRONLY|O_TRUNC|O_CREATE);

    Запись в файл делаем функцией print.

    print(FFF "oppa! Пишем в файл!");

    Здесь FFF - имя файлового манипулятора, а строка в кавычках - текст, который мы хотим записать в файл, ассоциированный с FFF.

    Если до попытки открытия файла не существовало, то функция open его создаст, а если файл был, и он был не пустой, то после вышеуказанной функции print, в нем ничего не останется от предыдущей информации, а записана будет та ерунда, которую я там вписал.

    Как уже было сказано, существуют три стандартных файловых манипулятора, и при опущенном файловом манипуляторе функция print осуществит вывод в STDOUT (то же относится к функциям printf и write). Чтобы изменить направление вывода в Perl предусмотрена функция select (правда не только для этого). Пример:

    open(F1,"> one.txt");
    print "Файл открыт! Пишем в STDOUT.";
    $old_point=select(F1);
    print "Пишем в файл one.txt";
    select($old_point);
    print "Снова пишем в STDOUT.";
    close(F1);
    

    Закрываем файл функцией close.

    close(FFF);

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

    Блокировка файла

    Во-первых для чего? А для того, что если несколько процессов хотят одновременно заполучить доступ к файлу, причем на запись, причем еще и хотят туда что-то писать (кошмар), то представьте, что оказалось бы, если не этот чудный механизм блокировки. Он позволяет, грубо говоря, ставить процессы в очередь. Делаем так:

    open(FIL,"> file.dat");
    flock(FIL,2);
    close(FIL);
    

    О функциях open и close уже говорили, а на flock остановимся немного подробнее. Она получает два параметра - файловый манипулятор и, образно говоря, категорию блокировки.

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

    Про снятие блокировки: блокировка автоматически снимается при завершении процесса, вызванного текущим скриптом, либо при закрытии файлового манипулятора, который "привязан" к заблокированному файлу. Если вы снимаете блокировку вручную, будьте аккуратны - вы даете возможность другому процессу делать с (ВНИМАНИЕ!) не закрытым вами файлом все что ему угодно! Последствия могут быть, мягко говоря, неприятные, а грубо говоря - непредсказуемые (для вас непредсказуемые).

    Работа со строками в файле

    Так как именно те файлы, которые содержат строковую информацию составляют наибольший интерес для, собственно, человека, то и речь сейчас пойдет именно о них.

    Для чтения строк из файла используется файловый манипулятор "поставленный" в <>.

    Например:

    open(FIL,"data.txt");
    while(<FIL>)
    {
    # делаем что-то с каждой строкой файла
    }

    Если не указано иначе, то внутри такого цикла используется стандартная переменная "$_", а номер строки записывается в "$.". Так как конец строки обозначается спецсимволом, например "\n", для получения самой строки (без эдакого "хвоста") нужно ее усечь функцией chomp.

    open(FIL,"data.txt");
    while(<FIL>)
    {
    chomp; # отрезается спецсимвол от переменной $_
    print; # пишем $_ на STDOUT
    }
    

    Можно прочитать строки в массив:

    @strings=<FIL>;
    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 - с конца файла.

    Нельзя сказать, что это все, что нам предлагает Perl для работы с файлами. Будем надеяться, что у меня будет время на то, чтобы написать о том, как работать с каталогами, тонкости при работе с бинарными файлами, объектно-ориентированный подход к управлению файлами и их содержимым.

    Буду очень благодарен за сообщения о возможных ошибках и неточностях в этой статье.

    С уважением. © 2001 Чернявин Александр

  • Rambler's Top100
    Hosted by uCoz