unix 2015-08-23 02-15-15
Работа с файлами в Perl. Примеры
Работа с данными
Создание нового файла, открытие файла, запись в файл
Чтение данных из файла
Манипуляции с файлами
Как переименовать файл
Как получить информацию о файле (дата создания и т.п.)
Как изменить время последнего обращения к файлу и его модификации
Как удалить файл
Как изменить права доступа к файлам
Как изменить владельца файла
Перемещение и копирование файлов. File::Copy
Полезные ссылки
Работа с данными
Создание файла, открытие файла, запись в файл
use strict;
open FILE, '>>file.txt';
print FILE "Холодное сердце согреешь руками\n";
print FILE "И я буду рядом, ночами и днями\n";
close FILE;
Файл можно открыть для чтения, записи в конец файла, перезаписи, чтения/записи. Для этого нужно использовать префиксы:
< — режим чтения
> — режим записи. Если файл уже содержал что-то, эти данные будут удалены
>> — режим записи. Запись новых данных будет вестись в конец файла. Старые данные сохраняются
+< — сохраняет содержимое открываемого файла
+> — сначала очищает содержимое открываемого файла
+>> — сохраняет содержимое открываемого файла, запись в файл всегда осуществляется в конец содержимого файла
Если префикс не задан, файл по умолчанию будет открыт в режиме чтения.
Если открыть для записи файл, который еще не существует, то при завершении работы будет создан новый файл.
Чтение данных из файла
open FILE, 'file.txt';
while (defined (my $file_line = <FILE>)) {
print $file_line;
}
close FILE;
Чтение из файла осуществляется построчно.
Манипуляции с файлами
Как переименовать файл
rename "file.txt", "file2.txt";
Функция rename — переименовывает указанный список файлов. Возвращает 1 в случае успешного переименования, в другом случае — 0.
my $status = rename "file2.txt", "file.txt";
print "Файл успешно переименован\n" if $status;
Как получить информацию о файле (дата создания и т.п.)
#!/usr/local/bin/perl
use strict;
my %file_info = ();
($file_info{dev},$file_info{ino},$file_info{mode},$file_info{nlink},
$file_info{uid},$file_info{gid},$file_info{rdev},$file_info{size},$file_info{atime},
$file_info{mtime},$file_info{ctime},$file_info{blksize},
$file_info{blocks}) = stat('file.txt');
my ( $sec, $min, $hour, $mday, $mon, $year, $wday ) = gmtime($file_info{mtime});
$year+=1900; $mon+=1;
print "Время последнего изменения файла: $mday-$mon-$year , $hour:$min\n";
exit;
Функция stat возвращает информацию в списковом контексте, в следующем порядке:
dev — Номер устройства в файловой системе
ino — Номер индексного дескриптора
mode — Режим файла (тип и права доступа)
nlink — Количество жестких ссылок на файл (в отсутствии ссылок равно 1)
uid — Числовой идентификатор владельца файла
gid — Числовой идентификатор группы владельца файла
rdev — Идентификатор устройства (только для специальных файлов)
size — Размер файла в байтах
atime — Время последнего обращения к файлу с начала эпохи
mtime — Время последнего изменения файла с начала эпохи
ctime — Время изменения индексного дескриптора с начала эпохи
blksize — Предпочтительный размер блока для операций ввода/вывода
blocks — Фактическое количество выделенных блоков для размещения файла
Начало эпохи датируется 1 января 1900 года 0 часов 0 минут.
Таким образом можно, например, проверить дату последнего изменения файла и удалить его.
Как изменить время последнего обращения к файлу и его модификации
Функция позволяет utime() изменить время последнего обращения (atime) и модификации файла (mtime).
my $atime = time; # т.е. текущее время
my $mtime = time;
utime($atime, $mtime, "file.txt", "file2.txt");
Функция возвращает число файлов, для которых операция изменения времени прошла успешно.
Как удалить файл
Функция unlink удаляет переданный список файлов. Возвращает число успешно удаленных файлов.
unlink "file2.txt", "file3.txt";
Как изменить права доступа к файлам
chmod 0666, "file.txt";
Функции chmod можно передать список файлов, тогда права доступа будут изменены к каждому из них. Функция задает права доступа для владельца файла, группы и для всех остальных пользователей.
chmod() возвращает число файлов, права доступа к которым были благополучно изменены.
Памятка: чтобы установить права доступа, нужно указать число:
1 (- -x) — возможно только выполнение файла
2 (-w-) — возможна только запись в файл
3 (-wx) — только запись в файл и его выполнение
4 (r- -) — только чтение данных из файла
5 (r-x) — только чтение и выполнение файла
6 (rw-) — только чтение и запись в файл
7 (rwx) — полный доступ: возможно чтение, запись в файл и его запуск на выполнение.
Как изменить владельца файла
Чтобы изменить владельца файла, надо знать его uid и gid. Ну и кроме того, надо иметь права на выполнение данной команды.
Если нужно изменить владельца сразу нескольким файлам, можно передать ф-ции список файлов.
Узнать uid и gid текущего владельца файла можно с помощью ф-ции stat.
my $uid = 257;
my $gid = 7;
my $res = chown($uid, $gid, "file.txt", "assa.txt");
print "Число измененных файлов: $res\n";
chown() возвращает число файлов, владелец для которых был благополучно изменен.
Перемещение и копирование файлов. File::Copy
Модуль File::Copy предоставляет 2 удобные функции для копирования и перемещения файлов из одного места в другое.
use File::Copy;
copy("/home/user/file.txt","/home/user/file2.txt") || die "Copy failed: $!";
move("/home/user/file2.txt","/home/user/file3.txt") || die "Move failed: $!";
Оба метода позволяют использовать не только имена, но и дескрипторы файлов. Например, так:
use File::Copy;
open FILE, '>file.txt';
copy ("/home/user/file2.txt", \*FILE) or die "Copy failed: $!";
close FILE;
Полезные ссылки
search.cpan.org: File::Copy
http://perl.find-info.ru/perl/006/file.htm
http://www.spravkaweb.ru/perl/file/
http://www.codenet.ru/webmast/perl/files.php
http://dev-lab.info/2011/01/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8-%D0%B2-perl-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/