Учебники

Perl — File I / O

Основы обработки файлов просты: вы связываете дескриптор файла с внешним объектом (обычно файлом), а затем используете различные операторы и функции в Perl для чтения и обновления данных, хранящихся в потоке данных, связанных с дескриптором файла.

Файловый дескриптор — это именованная внутренняя структура Perl, которая связывает физический файл с именем. Все файловые дескрипторы имеют доступ для чтения / записи, поэтому вы можете читать и обновлять любой файл или устройство, связанное с файловым дескриптором. Однако, когда вы связываете файловый дескриптор, вы можете указать режим, в котором открывается файловый дескриптор.

Три основных файловых дескриптора — STDIN , STDOUT и STDERR, которые представляют стандартный ввод, стандартный вывод и стандартные устройства ошибок соответственно.

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

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

open FILEHANDLE, EXPR
open FILEHANDLE

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

Здесь FILEHANDLE — дескриптор файла, возвращаемый функцией open, а EXPR — выражение, имеющее имя файла и режим открытия файла.

Открытая функция

Ниже приведен синтаксис для открытия файла file.txt в режиме только для чтения. Здесь знак «<» означает, что файл должен быть открыт в режиме только для чтения.

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

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

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";

while(<DATA>) {
   print "$_";
}

Ниже приведен синтаксис для открытия файла file.txt в режиме записи. Здесь знак «меньше» означает, что файл должен быть открыт в режиме записи.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

Этот пример фактически обрезает (очищает) файл перед тем, как открыть его для записи, что может не иметь желаемого эффекта. Если вы хотите открыть файл для чтения и записи, вы можете поставить знак плюс перед символами> или <.

Например, чтобы открыть файл для обновления, не обрезая его —

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

Чтобы сначала обрезать файл —

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

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

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

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

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

Ниже приведена таблица, в которой приведены возможные значения различных режимов.

Sr.No. Сущности и определения
1

<или r

Доступ только для чтения

2

> или ш

Создает, пишет и усекает

3

>> или

Пишет, добавляет и создает

4

+ <или r +

Читает и пишет

5

+> или w +

Читает, пишет, создает и усекает

6

+ >> или +

Читает, пишет, добавляет и создает

<или r

Доступ только для чтения

> или ш

Создает, пишет и усекает

>> или

Пишет, добавляет и создает

+ <или r +

Читает и пишет

+> или w +

Читает, пишет, создает и усекает

+ >> или +

Читает, пишет, добавляет и создает

Функция Sysopen

Функция sysopen похожа на основную функцию open, за исключением того, что она использует функцию system open () , используя параметры, предоставленные ей в качестве параметров для системной функции —

Например, чтобы открыть файл для обновления, эмулируя формат + <имя файла из open —

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

Или обрезать файл перед обновлением —

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

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

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

Ниже приведена таблица, в которой приведены возможные значения MODE.

Sr.No. Сущности и определения
1

O_RDWR

Прочти и напиши

2

O_RDONLY

Только чтение

3

O_WRONLY

Только запись

4

O_CREAT

Создать файл

5

O_APPEND

Добавить файл

6

O_TRUNC

Усекать файл

7

O_EXCL

Останавливается, если файл уже существует

8

O_NONBLOCK

Неблокирующее удобство использования

O_RDWR

Прочти и напиши

O_RDONLY

Только чтение

O_WRONLY

Только запись

O_CREAT

Создать файл

O_APPEND

Добавить файл

O_TRUNC

Усекать файл

O_EXCL

Останавливается, если файл уже существует

O_NONBLOCK

Неблокирующее удобство использования

Функция закрытия

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

close FILEHANDLE
close

Если FILEHANDLE не указан, он закрывает текущий выбранный дескриптор файла. Он возвращает true, только если он может успешно очистить буферы и закрыть файл.

close(DATA) || die "Couldn't close file properly";

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

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

Оператор <FILEHANDL>

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

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

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

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

Функция getc

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

getc FILEHANDLE
getc

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

Функция чтения

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

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

Длина считываемых данных определяется как LENGTH, и данные помещаются в начало SCALAR, если не указано OFFSET. В противном случае данные помещаются после байтов OFFSET в SCALAR. Функция возвращает количество байтов, прочитанных в случае успеха, ноль в конце файла или undef, если произошла ошибка.

Функция печати

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

print FILEHANDLE LIST
print LIST
print

Функция печати печатает оцененное значение LIST в FILEHANDLE или в текущий дескриптор выходного файла (по умолчанию STDOUT). Например —

print "Hello World!\n";

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

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

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>) {
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

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

Вот пример, который показывает, как мы можем переименовать файл file1.txt в file2.txt. Предполагая, что файл доступен в каталоге / usr / test.

#!/usr/bin/perl

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

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

Удаление существующего файла

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

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

Позиционирование внутри файла

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

Функция сказать

Первое требование — найти вашу позицию в файле, что вы делаете с помощью функции Tell —

tell FILEHANDLE
tell

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

Функция поиска

Функция поиска позиционирует указатель файла на указанное количество байтов в файле —

seek FILEHANDLE, POSITION, WHENCE

Функция использует системную функцию fseek, и у вас есть такая же возможность позиционирования относительно трех разных точек: начала, конца и текущей позиции. Вы делаете это, указав значение для WHENCE.

Ноль устанавливает положение относительно начала файла. Например, строка устанавливает указатель файла на 256-й байт в файле.

seek DATA, 256, 0;

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

Вы можете очень быстро протестировать некоторые функции в Perl, используя серию тестовых операторов, известных как -X тесты. Например, чтобы выполнить быструю проверку различных прав доступа к файлу, вы можете использовать такой скрипт:

#/usr/bin/perl

my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
   push @description, 'binary' if (-B _);
   push @description, 'a socket' if (-S _);
   push @description, 'a text file' if (-T _);
   push @description, 'a block special file' if (-b _);
   push @description, 'a character special file' if (-c _);
   push @description, 'a directory' if (-d _);
   push @description, 'executable' if (-x _);
   push @description, (($size = -s _)) ? "$size bytes" : 'empty';
   print "$file is ", join(', ',@description),"\n";
}

Вот список функций, которые вы можете проверить для файла или каталога —

Время запуска скрипта минус время последнего обращения к файлу, в днях.

-B

Это бинарный файл?

Время запуска скрипта минус время последнего изменения файла inode, в днях.

Время запуска скрипта минус время модификации файла, в днях.

Принадлежит ли файл реальному идентификатору пользователя?

Является ли файл читаемым по реальному идентификатору пользователя или реальной группе?

-S

Является ли файл сокетом?

-T

Это текстовый файл?

-W

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

-ИКС

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

-b

Это специальный файл блока?

Это специальный символьный файл?

-d

Является ли файл каталогом?

-e

Файл существует?

-f

Это простой файл?

В файле установлен бит setgid?

-k

В файле установлен бит?

-l

Является ли файл символической ссылкой?

Владеет ли файл эффективным идентификатором пользователя?

-п

Является ли файл именованным каналом?

Является ли файл читаемым по эффективному идентификатору пользователя или группы?

-s

Возвращает размер файла, нулевой размер = пустой файл.

-t

Файл-дескриптор открыт TTY (терминалом)?

-u

В файле установлен бит setuid?

-w

Является ли файл доступным для записи по эффективному идентификатору пользователя или группы?

-Икс

Выполняется ли файл по эффективному идентификатору пользователя или группы?

-z

Размер файла равен нулю?