Регистрация

Имя:
Емаил:
Пароль:
- показать пароль
Аватар:


ВХОД

Емаил:
Пароль:
- показать пароль



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

3874
28.09.2009 00:00

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

 Функции для работы с файлами играют довольно большую роль во всех языках

програмирования. Ни один серьезный проект не обходится без их применения. В Perl

эти функции представлены довольно широко. В этой статье я постараюсь рассказать

тебе о них.

Открытие/закрытие файлов

В Perl файл открывается как поток. Для последущего обращения к этому потоку

при открытии создается так называемый дискриптор файла. Например:

open(PASSWD, "/etc/passwd");

Тут мы открыли на чтение файл /etc/passwd и связали его с дискриптором PASSWD.

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

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

следущие указатили:

< - только чтение

> - только запись (файл усекается до нулевой длинны)

+< - чтение/запись

+> - чтение/запись

>> - дозапись в конец файла

+>> - чтение/дозапись

Для указания прав надо писать эти значки перед именем файла. Например:

open(PASSWD, ">> /etc/passwd");

Также существует способ открытия файлов позволяющий задать более гипкие права.

В часности указать что делать в случае отсутствия файла. Для этого надо

использовать функцию:

sysopen(FH,$name, $flags, $param);

FH - файловый дескриптор.

$name - имя файла ( без > и др.)

$flags - права доступа. Они могут иметь следущие значения:

O_RDONLY - Только для чтения

O_WRONLY - Только для записи

O_RDWR - Для чтения и для записи

O_CREAT - Если файла нет, создать!

O_APPEND - Открытие в режиме дозаписи

O_TRUNC - Очищаем содержимое при открытии

Их можно комбинировать с помощью значков |. Например:

sysopen(PASSWD, "/etc/passwd", O_WRONLY|O_TRUNC|O_CREATE) - откроет

файл /etc/passwd только для записи, при этом усечет его содержимое

до нулевой длинны если он существует, а если не существует то создаст.

$param - Необязательный параметр который задает маску доступа к файлу для

Unix систем. Если он не указан берется 0666.

Также существует возможность заблокировать открытый файл. Это нужно для того

чтобы исключить возможность того что другая программа изменит ваш файл пока

вы с ним работаете. Для блокировки используйте функцию flock(); Ей необходимо

передать два параметра. Файловый дескриптор и тип блокировки. Типы блокировки

бывают следущие:

1 - совместная (для чтения)

2 - монопольная (для записи)

4 - ассинхронный сброс блокировки

8 - снятие блокировки

Пример использования: flock(PASSWD, 2);

Для закрытия файла используется функция close(); Например close(PASSWD);

Чтение/запись

Для того чтобы прочитать строку из открытого файло нужно воспользоваться

такой конструкцией: $str= Если вместо переменной $str использовать

массив @file=, то в итоге мы получим в массиве @file - все строки

файла. К томуже мы в полне можем использовать для чтения файла такой цикл:

while(){

# делаем что-то со строкой

}

Внутри такого цикла, каждая следущая строка будет находиться внутри переменной

'$_'. Номер строки храниться в переменной '$.'.

Для перемещения по файлу можно воспользоваться функциями tell() и seek().

Первая возвращает текущую позицию указателя в файле: $pos=tell(PASSWD);

А вторая устанавливает указатель на указаную позицию. Причем позицию можно

указать как положительную так и отрицатильную. В качестве третьего необязатель-

ного параметра эта функция принемает указатель отсчета. Он может быть равен

0 - от начала файла, 1 - от текущего положения и 2 - от конца файла.

Пример:

$pos=tell(PASSWD);

seek(PASSWD, $pos+10, 1);

Для записи в файл используйте функцию print с указанием потока. Например:

print PASSWD "cobalt:*:10:10:/bin/bash\n";

Файловая система

Для того чтобы удалить существующий файл надо воспользоваться функцией unlink()

Эта функция может принемать список имен файлов для удаления. Например:

unlink("/etc/test","/etc/test1");

Переименование файла осуществляется командой rename($old, $new);

С каталогами дело обстоит по другому. Для создания каталога например надо

заюзать функцию mkdir(). Она принемает два параетра. Первый - имя каталога,

второй - права доступа для unix систем. Для удаления каталога используйте

rmdir($dirname). Только необходимо помнить что rmdir удаляет только пустые

каталоги.

Т.к. Perl изначально разрабатывался для Unix систем, то логично что в нем

существуют функции для изменения прав на файл и смены владельца.

chmod(0666,"/etc/passwd") - делает файл /etc/passwd доступным на чтение для всех

chown(1234, 35, "/etc/passwd"); Теперь владелец файла /etc/passwd тот у кого

UID (идентификатор пользователя) = 1234 и GID (идентификатор группы) = 35.

Мы можем изменить и метку времени файла воспользовавшись функцией utime и

передав ей в качестве параметров время создания, время изменения и имя файла:

$time=700000000;

utime($time,$time,"/etc.passwd");

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

Cпособ 1 - функции -X (его очень удобно использовать для проверок в конструк-

циях if(){}):

-e $filename провераяет существование файла

-z $filename проверяет пустой ли файл

-r $filename проверка прав на чтение файла

-w $filename проверка прав на изменение

-x $filename проверка прав на выполнение файла

-o $filename Я владелец файла ?

-f $filename это обычный файл?

-d $filename это каталог?

-l $filename это символическая ссылка?

-p $filename это FIFO?

-S $filename это сокет?

-b $filename это блок-ориентированное спец. устройство?

-c $filename это символьное спец. устройство?

-t $filename Файловый манипулятор открыт для терминала?

-u $filename У файла установлен бит setuid?

-g $filename У файла установлен бит setgid?

-k $filename У файла установлен бит запрета (бит-липучка)?

-T $filename Это текстовый файл?

-B $filename Это двоичный файл?

int(-s $filename) вернет размет файла

int(-M $filename) вернет кол-во дней со дня изменения

int(-A $filename) вернет кол-во дней со дня чтения

int(-C $filename) вернет кол-во дней со дня изменения дескриптора

Способ 2 - функция stat

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,

$atime, $mtime, $ctime, $blksize, $blocks) = stat($filename);

($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,

$atime, $mtime, $ctime, $blksize, $blocks) = stat(FILEHANDLE);

stat возвращает список из 13-ти элементов. Вот их значение:

0 $dev номер устройства, на котором расположен файл

1 $ino номер файлового дескриптора

2 $mode флаги файла (права, setuid и прочее)

3 $nlink количество (жестких) ссылок на файл

4 $uid числовой идентификатор пользователя владельца файла

5 $gid числовой идентификатор группы владельца файла

6 $rdev идентификатор устройства (только спец. файлов)

7 $size размер файла в байтах

8 $atime время последнего чтения файла в секундах с 1.1.1970

9 $mtime время последнего изменения файла в секундах с 1.1.1970

10 $ctime время последнего изменения файлового дескриптора в секундах с

1.1.1970

11 $blksize предпочтительный размер блока в файловой системе

12 $blocks количество блоков, зарезервированых на данный момент

Для перемещения по дереву каталогов можно воспользоваться функцией chdir. Она

предназначина для установки текущего каталога.

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

открыть каталог:

opendir(ETC, "/etc");

@dir=readdir(ETC);

closedir(ETC);

Теперь в массиве dir список фалов каталога /etc.

В перл есть возможность создавать и ссылки. Для создания жесткой ссылкой надо

воспользоваться функцией link($file,$link); а для создания символической -

symlink($file,$link);

Заключение

Ну вот. Я перечислил все основные функции применяемые в Perl для работы с

файлами. Надеюсь что для тебя этот мануал будет полезным.



Ваш комментарий будет опубликован от имени 'Гость'. Если что, то Вход тут!
Loading...