Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работаем с файлами на 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
    Чернявин Александр( mailto:lodevar2@mtu-net.ru )
  • Оставить комментарий

    Комментарий:
    можно использовать BB-коды
    Максимальная длина комментария - 4000 символов.
     

    Комментарии

    1.
    98K
    06 февраля 2017 года
    Dina Haines
    0 / / 06.02.2017
    Мне нравитсяМне не нравится
    6 февраля 2017, 13:23:29
    Thank you for this awesome post
    2.
    58K
    08 февраля 2010 года
    achepkunov
    0 / / 08.02.2010
    +0 / -1
    Мне нравитсяМне не нравится
    8 февраля 2010, 12:11:19
    стоит дополнить
    Код:
    some_sub(*FILL);



    sub some_sub(*;)

    {

        *LOCAL_FILE = @_[0];

    }

    3.
    2.8K
    13 марта 2004 года
    Arsench
    27 / / 13.03.2004
    +0 / -1
    Мне нравитсяМне не нравится
    10 ноября 2008, 19:17:40
    у меня такой вопрос, как могу через перл скрипт execute файл определенном время и день.Hапример перл скрипт считает если время 7 утра то начинает исполнят автоматически
    4.
    Аноним
    +1 / -2
    Мне нравитсяМне не нравится
    4 октября 2005, 15:59:40
    А читать из файла видимо не надо
    5.
    Аноним
    +3 / -1
    Мне нравитсяМне не нравится
    10 июня 2004, 13:02:38
    Можно прочитать строки в массив:

    @strings=<FIL>;
    foreach $line (@strings)
    {


    print $list;
    !!! нужно print $line;
    }

    Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
    Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог