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

Perl имеет доступ к тем же основным, помогающим управлять исполнением программ дескрипторам файлов, а именно как: STDIN, STDOUT и STDERR. Более того, возможности для работы с дескрипторами файлов, которые указывают на реальные файлы, в Perl очень обширны и позволяют делать так, чтобы программы обрабатывали файлы любым необходимым образом. С помощью дескрипторов файлов можно открыть файл, передать его в массив, записать информацию в новый файл или даже выполнить все эти операции сразу со многими файлами одновременно.

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

  1. while (<>)
  2. {
  3. print $_;
  4. }

Затем запустите свою программу, указав одно или более имен файлов в командной строке:

# ./myscript.pl filel.txt file2.txt

Это приведет к распечатке содержимого всех указанных файлов, почти так же, как и при использовании команды cat. Такой способ получения доступа к содержимому файлов является удобным и быстрым. Однако он также и достаточно ограниченный; ромбическая операция в принципе представляет собой "вырожденный вариант" истинного дескриптора файла. Давайте рассмотрим несколько заданных должным образом дескрипторов, чтобы увидеть, что они на самом деле могут делать.

Название дескриптора файла принято вводить заглавными буквами. Создать его можно командой open(). После этого с ним можно выполнять следующие действия: читать из него информацию, передать в него информацию или закрыть его. Ниже показано, как можно открыть файл и распечатать его строка за строкой:

  1. open (FH,"/path/to/filel.txt");
  2. while ($thisline = <FH>)
  3. {
  4. chomp ($thisline);
  5. print "$i: $thisline\n";
  6. }
  7. close (FH);

Бывает так, что Perl не удается открыть файл, либо потому что он не существует, либо потому что установленные полномочия не разрешают выполнять чтение этого файла, либо еще по какой-то причине. Вы можете перехватить подобные события, воспользовавшись операцией die: если при вычислении выражения управление перейдет к die, он передаст свой аргумент (если таковой имеется) на стандартный вывод и выполнение сценария завершится. Ниже показан наиболее распространенный способ применения операции die при открытии файлов:

open (FH,"/path/to/filel. txt") || die ("Невозможно открыть filel.txt!");

Выполнение записи в файлы является немного более сложной задачей, поточу что существует так много различных способов того, как ее можно выполнить, Главное, запомните, что для записи можно применять любой дескриптор, который разрешается использовать в командной строке, такой как > (перезапись) или >>(добавление), или даже | (конвейер). Последний может пригодиться, скажем, для того, чтобы сценарий записывал свой вывод в электронное сообщение (обратите внимание на упрощенный метод прохода через массив @contents и распечатки каждой строки):

  1. open (FH,">/path/to/file2.txt");
  2. print FH $_ foreach (@contents);
  3. close (FH);
  4.  
  5. open (MAIL,"| /usr/sbin/sendmail -oi -t");
  6. print MAIL "From: me\@somewhere.com\n";
  7. print MAIL "To: you\@somewhereelse.com\n";
  8. print MAIL "Subject: Важная информация!\n\n";
  9. print MAIL $_ foreach (@contents);
  10. close (MAIL);

Дескриптор файла передается в качестве аргумента команде print; здесь важно понимать следующее: если только не был указан какой-то другой дескриптор, предполагается, что этим аргументом является встроенный дескриптор файлов (стандартный вывод). Также еще имеется дескриптор (стандартный ввод). Чтобы указать дескриптор устройства ввода-вывода, который должен использоваться по умолчанию, применяйте функцию select(

):

select(FH);

В таком случае вам не придется все время вводить print FH. Однако вам обязательно нужно будет изменить дескриптор обратно ка STDOUT. когда вы закончите работать с FH.

Для работы с каталогами доступны свои функции: opendir () и readdir (); вы можете открыть каталог и прочитать его содержимое в массив следующим образом:

  1. opendir (DIR,"/path/to/dir");
  2. @files = sort readdir (DIR);
  3. closedir (DIR);

Даже с помощью всего лишь описанных методов вы уже можете делать некоторые очень интересные вещи. Например, вы можете открыть файл /etc/passwd, выбрать оттуда все записи с идентификатором пользователя (UID) больше 1000 и распечатать регистрационные и обычные имена таких пользователей:

  1. #!/usr/bin/perl
  2.  
  3. open (PASSWD,"/etc/passwd") || die ("Невозможно открыть файл passwd!");
  4. while($line = @passwd)
  5. {
  6. @userdata = split(/:/,$line);
  7. if($userdata[2] > 1000)
  8. {
  9. print "$userdata[0]: $userdata[4]\n";
  10. }
  11. }

Вот и готова полезная программа! Именно это и делает Perl таким популярным. Он позволяет создавать программы, затрачивая лишь минимальное количество усилий, что значительно упрощает жизнь.

Понравилась статья?

Прочитано 1921 раз

Добавить комментарий


Защитный код
Обновить