Функция open открывает файл, имя которой задается в EXPR, и связывает его с внутренним указателем FILEHANDLE.
Простой пример открытия файла для чтения:
open(my $fh, '<', "input.txt") or die $!;
и для записи:
open(my $fh, '>', "output.txt") or die $!;
Если FILEHANDLE является неопределенной скалярной переменной
(а также массивом или элементом хэша), переменной присваивается ссылка
на новый анонимный указатель файла. Иначе, если
FILEHANDLE является выражением, его значение используется в качестве
имени существующего файлового дескриптора. (Так как возвращаемое значение
интерпретируется как символическая ссылка, необходимо, чтобы
это выражение было вне области действия use strict 'refs'
.)
Если не указан параметр EXPR, то ведется поиск скалярной переменной
с тем же именем, что и FILEHANDLE. Эта переменная должна содержать имя файла
и необязательный режим.
(Заметим, что лексические переменные, объявленные оператором my
,
не будут работать для этих целей; поэтому, если вы используете
my
, укажите EXPR в вашем вызове open.)
Если указано три или более аргументов, тогда подразумевается, что режим открытия и
имя файла указаны раздельно. Если MODE содержит '<'
или пуст,
то файл открывается для чтения. Если MODE содержит '>'
, файл очищается и
открывается для записи, при необходимости создается. Если MODE содержит '>>'
,
файл открывается для дозаписи, также создается при необходимости.
Можно поместить символ '+'
перед любым из символов '>'
или '<'
чтобы открыть файл одновременно для чтения и записи.
Так как режим '+>'
затирает содержимое файла прежде чем
можно будет что-нибудь из него прочесть, то режим '+<'
почти всегда предпочтительнее для чтения/обновления по записи.
Можно рассматривать файл, открытый в режиме обновления, как базу
данных с произвольным доступом и перемещаться к байту с заданным
номером при помощи seek
, но переменная длина записей в обычных
текстовых файлах делает непрактичным использование режима чтения-записи
для обновления таких файлов. Лучший подход к обновлению говорится
в описании параметра командной строки i в спецификации perlrun.
Файл создается с режимом доступа 0666
, данный режим зависит от текущей
umask
процесса.
Все эти префиксы соответствуют режимам 'r'
,
'r+'
, 'w'
, 'w+'
, 'a'
, и 'a+'
в функции fopen(3).
Если open
вызывается с одним или двумя аргументами, то режим
и имя файла должны быть объединены(в таком порядке), возможно
разделенные пробелом. Если режим не указан, тогда
предполагается режим для чтения '<'
.
open(my $fh, "<:encoding(UTF-8)", "filename") || die "Ошибка при открытии файла в кодировке UTF-8: $!";
открывает UTF-8 закодированный файл, см. perluniintro. Отметим,
что если дисциплины указаны в трех-аргументной форме open
,
то по умолчанию дисциплины, содержащиеся в ${^OPEN}, игнорируются.
(см. perlvar, обычно устанавливается прагмой open
или c помощью ключей командной строки -CioD)
Функция open()
возвращает ненулевое значение в случае успеха и
неопределенное значение в противном случае.
Если Perl исполняется на системе, которая различает текстовые
и двоичные(бинарные) файлы, то при открытии двоичного файла следует указать
двоичный режим с помощью функции binmode. Основное отличие систем,
в которых требуется binmode
- в формате текстовых файлов.
Системам подобным Unix, Mac OS, и Plan 9, функция binmode
не требуется,
потому что в файлах данных систем каждая строка завершается одним символом,
соответствующим тому, что на языке Си определяется как перевод строки - "\n"
.