Perl специально разрабатывался для того, чтобы служить адекватным средством для чтения и записи в текстовые файлы. Тем не менее, как вы узнаете далее, Perl выполняет функции по произвольному доступу и вводу-выводу бинарных файлов. Операции по работе с файлами требуют указатель файла (file handle), который является переменной, соответствующей конкретному файлу. По умолчанию каждый скрипт на языке Perl имеет три стандартных указателя, которые Perl автоматически открывает при запуске скрипта: STDIN, STDOUT, STDERR. Эти три стандартных указателя отвечают стандартным потокам STDIN, STDOUT, STDERR языка программирования С. Кроме того, скрипт языка Perl может открыть дополнительные указатели для других специфических файлов.
Открытие файлов и других потоков
Для того чтобы скрипт использовал файл, он должен вызвать функцию open. Она имеет следующий вид:
open(FileHandle[, FileName])
В отличие от функции open библиотеки времени выполнения языка С, функция open языка Perl не содержит параметра mode в вызове функции. Perl определяет режим (mode) открытия файла, основываясь на имени файла. Таблица иллюстрирует связь режима открытия файла и имени файла.
Имя файла | Операция | <FILE> | Открыть файл только для чтения (аналогично функции fopen) | <<FILE> | Открыть файл для чтения (то же самое, что ) | <>FILE> | Создать файл для записи (как функции fopen) | <>>FILE> | Открыть файл для добавления в его конец (как <г+> функции fopen) | <+>FILE> | Создать файл для чтения/записи (как функции fopen) | <+<FILE> | Открыть файл для чтения/записи (как функции fopen) |
<| CMD> | Открыть канал из процесса, исполняющего команду | <CMD |> | Открыть канал процессу, исполняющему команду |
Примечание: Режим канального (pipe) потока может существовать не на всех системах.
Если в вызове функции open опущено имя файла, то Perl подразумевает, что имя файла содержится в строковой переменной $FileHandle. Когда скрипт завершил использование файла, он закрывает его, используя функцию close, как показано ниже:
close(FileHandle);
фрагмент программы иллюстрирует использование функций open иclose:
open(InFile, "test.dat") || die; # открываем для чтения # test.dat open(OutFile, ">test.dat") || die; # создаём test.dat $AuxFile = ">>test.dat"; open(Aux, $AuxFile) || die; # открывает для дополнения # test.dat close(InFile); close(OutFile); close(Aux);
Обратите внимание, что указатели файлов не имеют обычных односимвольных префиксов. Как вы узнаете далее, скрипты языка Perl могут хранить имена указателей в виде строк скалярных переменныхи передавать указатель любой функции, которая может их обрабатывать. При необходимости Perl выполняет конвертацию значений. В операционной системе MS-DOS Perl поддерживает дополнительную функцию, которая называется hinmode и позволяет файловому вводу/выводу переключаться между текстовым и бинарным режимами. В большинстве же систем различие между текстовым и бинарным режимами не имеет значения. Однако для операционной системы MS-DOS символ новой строки представляет собой последовательность из двух символов (CR+LF). Поскольку большинство программ не ожидают встретить два символа в конце строки, то система ввода/вывода должна выполнить преобразование. Для того чтобы можно было использовать функцию binmode, соответствующий указатель может быть открыт. Функция binmode имеет следующий формат:
binmode(FileHandle);
1 2
8 8 8
| |