Perl: операции с файлами

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

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

Файловый дескриптор— этоI/Oимя соединения.

Perl предоставляет три файловых дескриптора:STDIN,STDOUT,STDERRкоторые соответственно представляютстандартный ввод、стандартный выводистандартный вывод ошибок。

В Perl файлы можно открывать следующими способами:

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

Описание параметра:

  • FILEHANDLE: файловый дескриптор, используемый для хранения уникального идентификатора файла.
  • EXPR: выражение, состоящее из имени файла и типа доступа к файлу.
  • MODE: тип доступа к файлу.
  • PERMS: биты прав доступа.

Функция open

В следующем коде мы используем функцию open в режиме только для чтения<чтобы открыть файл file.txt:

open(DATA, "<file.txt");

<обозначает режим только для чтения.

DATA в коде — это файловый дескриптор, используемый для чтения файла. В следующем примере файл открывается и выводится его содержимое:

Пример

#!/usr/bin/perl open(DATA, "<file.txt") or die "Файл file.txt не может быть открыт,$!"; while(<DATA>){ print "$_"; }

Следующий код открывает файл file.txt в режиме записи>:

open(DATA, ">file.txt") or die "file.txt 文件无法打开, $!";

>обозначает режим записи.

Если вам нужно открыть файл в режиме чтения-записи, вы можете добавить знак + перед символом > или <:

open(DATA, "+<file.txt"); or die "file.txt 文件无法打开, $!";

Этот режим не удаляет исходное содержимое файла. Если вы хотите их удалить, формат выглядит следующим образом:

open DATA, "+>file.txt" or die "file.txt 文件无法打开, $!";

Если вы хотите добавить данные в файл, вам нужно всего лишь открыть файл в режиме добавления перед добавлением данных:

open(DATA,">>file.txt") || die "file.txt 文件无法打开, $!";

>>указывает на добавление данных в конец существующего файла. Если нужно прочитать содержимое файла, в который выполняется добавление, можно добавить знак +:

open(DATA,"+>>file.txt") || die "file.txt 文件无法打开, $!";

В следующей таблице перечислены различные режимы доступа:

ModeОписание
< или rОткрыть в режиме только для чтения, устанавливая указатель файла в начало файла.
> или wОткрыть в режиме записи, устанавливая указатель файла в начало файла и усекая размер файла до нуля. Если файл не существует, попытаться создать его.
>> или aОткрыть в режиме записи, устанавливая указатель файла в конец файла. Если файл не существует, попытаться создать его.
+< или r+Открыть в режиме чтения-записи, устанавливая указатель файла в начало файла.
+> или w+Открыть в режиме чтения-записи, устанавливая указатель файла в начало файла и усекая размер файла до нуля. Если файл не существует, попытаться создать его.
+>> или a+Открыть в режиме чтения-записи, установив указатель файла в конец файла. Если файл не существует, попытаться создать его.

Функция sysopen

sysopenЭта функция похожа на функцию open, за исключением того, что формы их параметров различаются.

В следующем примере файл открывается в режиме чтения-записи (+<filename):

sysopen(DATA, "file.txt", O_RDWR);

Если нужно очистить файл перед его обновлением, синтаксис следующий:

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

Можно использовать O_CREAT для создания нового файла, O_WRONLY для режима только для записи и O_RDONLY для режима только для чтения.

Параметр PERMS— это восьмеричное значение атрибута, указывающее разрешения после создания файла. По умолчанию —0x666。

В следующей таблице перечислены возможные значения режима:

ModeОписание
O_RDWRОткрыть в режиме чтения-записи, устанавливая указатель файла в начало файла.
O_RDONLYОткрыть в режиме только для чтения, устанавливая указатель файла в начало файла.
O_WRONLYОткрыть в режиме записи, устанавливая указатель файла в начало файла и усекая размер файла до нуля. Если файл не существует, попытаться создать его.
O_CREATСоздать файл
O_APPENDДописать в файл
O_TRUNCУсечь размер файла до нуля
O_EXCL Если файл существует при использовании O_CREAT, возвращается сообщение об ошибке; с его помощью можно проверить, существует ли файл.
O_NONBLOCKНеблокирующий ввод-вывод заставляет нашу операцию либо завершиться успешно, либо немедленно вернуть ошибку, не блокируясь.

Функция Close

После использования файла его следует закрыть, чтобы сбросить буферы ввода-вывода, связанные с дескриптором файла. Синтаксис закрытия файла следующий:

close FILEHANDLE
close

FILEHANDLE — указанный дескриптор файла; возвращает true, если закрытие успешно.

close(DATA) || die "无法关闭文件";

Чтение и запись файлов

Существует несколько различных способов чтения и записи информации в файлы и из файлов:

Оператор <FILEHANDL>

Основной способ чтения информации из открытого дескриптора файла — оператор <FILEHANDLE>. В скалярном контексте он возвращает одну строку из дескриптора файла. Например:

Пример

#!/usr/bin/perl print "Пример URL руководства?\n"; $name = <STDIN>; print "Веб-сайт:$name\n";

После запуска вышеуказанной программы будет отображена следующая информация. После того как мы введём URL, оператор print выведет:

Когда мы используем оператор <FILEHANDLE>, он возвращает список всех строк из файлового дескриптора. Например, мы можем импортировать все строки в массив.

Сначала создайте файл import.txt со следующим содержимым:

$ cat import.txt 
1
2
3

Прочитайте import.txt и поместите каждую строку в массив @lines:

Пример

#!/usr/bin/perl open(DATA,"<import.txt") or die "Unable to open data"; @lines = <DATA>; print @lines; # Вывод содержимого массива close(DATA);

После запуска вышеуказанной программы вывод будет следующим:

1
2
3

Функция getc

Функция getc возвращает один символ из указанного FILEHANDLE или из STDIN, если FILEHANDLE не указан:

getc FILEHANDLE
getc

Если возникает ошибка или если файловый дескриптор находится в конце файла, возвращается undef.


Функция read

Функция read используется для чтения информации из буферизованного дескриптора файла.

Эта функция используется для чтения двоичных данных из файла.

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

Описание параметра:

  • FILEHANDLE: файловый дескриптор, используемый для хранения уникального идентификатора файла.
  • SCALAR: Сохраняет результат. Если OFFSET не указан, данные размещаются в начале SCALAR. В противном случае данные размещаются после OFFSET байтов в SCALAR.
  • LENGTH: Длина содержимого для чтения.
  • OFFSET: Смещение.

В случае успеха возвращает количество прочитанных байтов; возвращает 0 в конце файла; возвращает undef при возникновении ошибки.

Функция print

Для всех функций, которые читают информацию из дескриптора файла, основной низкоуровневой функцией записи является print:

print FILEHANDLE LIST
print LIST
print

Используя дескриптор файла и функцию print, результаты программы можно отправить на устройство вывода (STDOUT: стандартный вывод), например:

print "Hello World!\n";

Копирование файла

В следующем примере мы откроем существующий файл file1.txt, прочитаем каждую его строку и запишем их в file2.txt:

Пример

#!/usr/bin/perl # Открыть файл в режиме только для чтения open(DATA1, "<file1.txt"); # Открыть новый файл и записать open(DATA2, ">file2.txt"); # Копировать данные while(<DATA1>) { print DATA2 $_; } close( DATA1 ); close( DATA2 );

Переименование файла

В следующем примере мы переименовываем существующий файл file1.txt в file2.txt в указанном каталоге /usr/example/test/:

#!/usr/bin/perl

rename ("/usr/example/test/file1.txt", "/usr/example/test/file2.txt" );

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

Удаление файлов

В следующем примере мы демонстрируем, как использовать функциюunlinkдля удаления файла:

Пример

#!/usr/bin/perl unlink ("/usr/example/test/file1.txt");

Указание позиции в файле

Вы можете использовать функциюtellдля получения позиции в файле и использовать функциюseekдля указания позиции внутри файла:

Функция tell

Функция tell используется для получения позиции в файле:

tell FILEHANDLE
tell

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

Функция seek

Функция seek() читает или записывает файлы, перемещая указатель чтения/записи файла через дескриптор файла, считывая и записывая в байтах:

seek FILEHANDLE, POSITION, WHENCE

Описание параметра:

  • FILEHANDLE: дескриптор файла, используется для хранения уникального идентификатора файла.
  • POSITION: указывает количество байтов, на которое должен переместиться дескриптор файла (указатель позиции чтения/записи).
  • WHENCE: указывает начальную позицию, с которой начинает перемещаться дескриптор файла (указатель позиции чтения/записи). Может принимать значения 0, 1, 2; соответственно обозначающие начало файла, текущую позицию и конец файла.

В следующем примере считываются 256 байтов с начала файла:

seek DATA, 256, 0;

Информация о файле

Файловые операции Perl также могут сначала проверить, существует ли файл, доступен ли он для чтения или записи, и т. д.

Сначала мы можем создать файл file1.txt со следующим содержимым:

$ cat file1.txt 
www.example.com

Пример

#/usr/bin/perl my $file = "/usr/test/example/file1.txt"; my (@description, $size); if (-e $file) { push @description, 'Это двоичный файл' if (-B _); push @description, 'Это сокет' if (-S _); push @description, 'Это текстовый файл' if (-T _); push @description, 'Это специальный блочный файл' if (-b _); push @description, 'Это специальный символьный файл' if (-c _); push @description, 'Это каталог' if (-d _); push @description, 'Файл существует' if (-x _); push @description, (($size = -s _)) ? "$sizebytes" : 'Пустой'; print "$fileИнформация:", join(', ',@description),"\n"; }

После выполнения вышеприведённой программы вывод:

file1.txt 信息:是一个文本文件, 15 字节

Операторы проверки файлов показаны в следующей таблице:

OperatorОписание
-AВремя последнего доступа к файлу (в днях)
-B Является ли это бинарным файлом
-C Время изменения индексного узла (inode) файла (в днях)
-M Время последнего изменения файла (в днях)
-O Файл принадлежит реальному UID
-R Файл или каталог может быть прочитан реальным UID/GID
-S Является сокетом
-T Является ли это текстовым файлом
-W Файл или каталог может быть записан реальным UID/GID
-X Файл или каталог может быть выполнен реальным UID/GID
-b Является блочным специальным файлом (например, смонтированный диск)
-c Является символьным специальным файлом (например, устройство ввода-вывода)
-d Является ли каталогом
-e Имя файла или каталога существует
-f Является обычным файлом
-g Файл или каталог имеет атрибут setgid
-k У файла или каталога установлен sticky-бит
-l Является символической ссылкой
-o Файл принадлежит эффективному UID
-p Файл является именованным каналом (FIFO)
-r Файл может быть прочитан эффективными UID/GID
-s Файл или каталог существует и не равен 0 (возвращает количество байтов)
-t Дескриптор файла является TTY (возвращает результат системной функции isatty(); нельзя использовать этот тест для имени файла)
-u Файл или каталог имеет атрибут setuid
-w Файл может быть записан эффективными UID/GID
-x Файл может быть выполнен с эффективными UID/GID
-zФайл существует, размер равен 0 (для каталогов всегда false), т. е. является ли он пустым файлом
Другие расширения