Perl - Файловый ввод-вывод
Основы работы с файлами просты: вы связываете filehandle с внешней сущностью (обычно файлом), а затем используйте различные операторы и функции в 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 | < or r Доступ только для чтения |
2 | > or w Создает, записывает и усекает |
3 | >> or a Записывает, добавляет и создает |
4 | +< or r+ Читает и пишет |
5 | +> or w+ Читает, записывает, создает и усекает |
6 | +>> or 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.
Ниже приводится таблица, в которой приведены возможные значения РЕЖИМА.
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 Неблокирующее удобство использования |
Функция закрытия
Чтобы закрыть дескриптор файла и, следовательно, отсоединить дескриптор файла от соответствующего файла, вы используете closeфункция. Это очищает буферы дескриптора файла и закрывает файловый дескриптор системы.
close FILEHANDLE
close
Если FILEHANDLE не указан, он закрывает текущий выбранный дескриптор файла. Он возвращает истину только в том случае, если ему удалось успешно очистить буферы и закрыть файл.
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. В противном случае данные помещаются после байтов СМЕЩЕНИЯ в СКАЛЯР. Функция возвращает количество байтов, прочитанных в случае успеха, ноль в конце файла или 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" );
Эта функция renames принимает два аргумента и просто переименовывает существующий файл.
Удаление существующего файла
Вот пример, который показывает, как удалить файл file1.txt с помощью unlink функция.
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
Размещение внутри файла
Вы можете использовать для tell функция, чтобы узнать текущую позицию файла и seek функция, указывающая на конкретную позицию внутри файла.
сообщить функции
Первое требование - найти свою позицию в файле, что вы делаете с помощью функции tell -
tell FILEHANDLE
tell
Это возвращает позицию указателя файла в байтах в пределах FILEHANDLE, если он указан, или текущий выбранный дескриптор файла по умолчанию, если он не указан.
Функция поиска
Функция поиска помещает указатель файла на указанное количество байтов в файле -
seek FILEHANDLE, POSITION, WHENCE
Функция использует системную функцию fseek, и у вас есть такая же возможность позиционирования относительно трех разных точек: начала, конца и текущей позиции. Для этого нужно указать значение WHENCE.
Ноль задает положение относительно начала файла. Например, строка устанавливает указатель файла на 256-й байт в файле.
seek DATA, 256, 0;
Информация о файле
Вы можете очень быстро протестировать определенные функции в Perl, используя серию операторов тестирования, известных под общим названием -X tests. Например, чтобы выполнить быструю проверку различных разрешений для файла, вы можете использовать такой сценарий:
#/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";
}
Вот список функций, которые вы можете проверить для файла или каталога -
Sr.No. | Оператор и определение |
---|---|
1 | -A Время запуска скрипта минус время последнего доступа к файлу, в днях. |
2 | -B Это бинарный файл? |
3 | -C Время запуска скрипта минус время последней смены индексного дескриптора файла, в днях. |
3 | -M Время запуска скрипта за вычетом времени модификации файла, в днях. |
4 | -O Файл принадлежит реальному ID пользователя? |
5 | -R Может ли файл прочитать настоящий идентификатор пользователя или настоящая группа? |
6 | -S Файл - это сокет? |
7 | -T Это текстовый файл? |
8 | -W Доступен ли для записи реальный идентификатор пользователя или реальная группа? |
9 | -X Может ли файл исполняться реальным идентификатором пользователя или реальной группой? |
10 | -b Это блочный специальный файл? |
11 | -c Это специальный символьный файл? |
12 | -d Файл - это каталог? |
13 | -e Файл существует? |
14 | -f Это простой файл? |
15 | -g В файле установлен бит setgid? |
16 | -k Установлен ли в файле липкий бит? |
17 | -l Является ли файл символической ссылкой? |
18 | -o Файл принадлежит действующему идентификатору пользователя? |
19 | -p Является ли файл именованным каналом? |
20 | -r Может ли файл прочитать действующий идентификатор пользователя или группы? |
21 год | -s Возвращает размер файла, нулевой размер = пустой файл. |
22 | -t Открывается ли дескриптор файла с помощью TTY (терминала)? |
23 | -u В файле установлен бит setuid? |
24 | -w Доступен ли файл для записи действующему идентификатору пользователя или группы? |
25 | -x Выполняется ли файл действующим идентификатором пользователя или группы? |
26 | -z Размер файла равен нулю? |