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 в коде — это файловый дескриптор, используемый для чтения файла. В следующем примере файл открывается и выводится его содержимое:
Пример
Следующий код открывает файл 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>. В скалярном контексте он возвращает одну строку из дескриптора файла. Например:
Пример
После запуска вышеуказанной программы будет отображена следующая информация. После того как мы введём URL, оператор print выведет:

Когда мы используем оператор <FILEHANDLE>, он возвращает список всех строк из файлового дескриптора. Например, мы можем импортировать все строки в массив.
Сначала создайте файл import.txt со следующим содержимым:
$ cat import.txt 1 2 3
Прочитайте import.txt и поместите каждую строку в массив @lines:
Пример
После запуска вышеуказанной программы вывод будет следующим:
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:
Пример
Переименование файла
В следующем примере мы переименовываем существующий файл file1.txt в file2.txt в указанном каталоге /usr/example/test/:
#!/usr/bin/perl
rename ("/usr/example/test/file1.txt", "/usr/example/test/file2.txt" );
Функцияrenamesпринимает только два параметра и переименовывает только существующие файлы.
Удаление файлов
В следующем примере мы демонстрируем, как использовать функциюunlinkдля удаления файла:
Пример
Указание позиции в файле
Вы можете использовать функцию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
Пример
После выполнения вышеприведённой программы вывод:
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), т. е. является ли он пустым файлом |