open
СОДЕРЖАНИЕ
ИМЯ
open - pragma Perl для установки значений по умолчанию слоев PerlIO для ввода и вывода
СИНОПСИС
use open IN => ":crlf", OUT => ":bytes";
use open OUT => ':utf8';
use open IO => ":encoding(iso-8859-7)";
use open IO => ':locale';
use open ':encoding(UTF-8)';
use open ':locale';
use open ':encoding(iso-8859-7)';
use open ':std'; ОПИСАНИЕ
Полная поддержка слоев ввода/вывода теперь реализована, при условии, что Perl настроен на использование PerlIO в качестве своей системы ввода/вывода (что является теперь значением по умолчанию).
Pragma open служит одним из интерфейсов для объявления значений по умолчанию «слоёв» (также известных как «дисциплины») для всех операций ввода/вывода. Любые операторы open(), readpipe() (также известные как qx//) и подобные, найденные в лексическом пространстве этого pragm, будут использовать объявленные значения по умолчанию. Даже операторы open() с тремя аргументами могут быть затронуты этим pragma, когда они не указывают слои ввода/вывода в MODE.
С помощью подpragma IN вы можете объявить слои по умолчанию для входных потоков, а с подpragma OUT — для выходных потоков. С подpragma IO вы можете контролировать одновременно входные и выходные потоки.
Если у вас есть устаревшая кодировка, вы можете использовать тег :encoding(...).
Если вы хотите установить слои кодировки на основе переменных среды locale, вы можете использовать тег :locale. Например:
$ENV{LANG} = 'ru_RU.KOI8-R';
# the :locale will probe the locale environment variables like LANG
use open OUT => ':locale';
open(O, ">koi8");
print O chr(0x430); # Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1
close O;
open(I, "<koi8");
printf "%#x\n", ord(<I>), "\n"; # this should print 0xc1
close I; Эти выражения эквивалентны
use open ':encoding(UTF-8)';
use open IO => ':encoding(UTF-8)'; как и эти
use open ':locale';
use open IO => ':locale'; и эти
use open ':encoding(iso-8859-7)';
use open IO => ':encoding(iso-8859-7)'; Сопоставление имён кодировок нестрогое: регистр не важен, и многие кодировки имеют несколько псевдонимов. Подробности и список поддерживаемых локалей см. в Encode::Supported.
Когда open() получает явный список слоёв (с синтаксисом с тремя аргументами), они переопределяют список, объявленный с помощью данного pragm. open() также может получить один двоеточие (:) для имени слоя, чтобы переопределить этот pragma и использовать значение по умолчанию (:raw в Unix, :crlf в Windows).
Подpragma :std сам по себе не имеет эффекта, но если его комбинировать с подpragmaми :utf8 или :encoding, он преобразует стандартные файловые дескрипторы (STDIN, STDOUT, STDERR) для соответствия кодировке, выбранной для входных/выходных дескрипторов. Например, если как вход, так и вывод выбраны в :encoding(UTF-8), то :std означает, что STDIN, STDOUT и STDERR также будут в :encoding(UTF-8). С другой стороны, если только вывод выбран в :encoding(koi8r), то :std приведет к тому, что только STDOUT и STDERR будут в koi8r. Подpragma :locale неявно включает :std.
Логика :locale подробно описана в encoding, но кратко: сначала происходит попытка получить nl_langinfo(CODESET), а затем угадывается значение из переменных среды LC_ALL и LANG.
Обработка дескрипторов каталогов также может в будущем поддерживать слои PerlIO.
ФУНКЦИОНАЛЬНОСТЬ NONPERLIO
Если Perl не скомпилирован для использования PerlIO в качестве системы ввода/вывода, доступны только два псевдо-слоя :bytes и :crlf.
Слой :bytes соответствует «бинарному режиму», а слой :crlf — «текстовому режиму» на платформах, которые различают эти два режима при открытии файлов (многие платформы семейства DOS, включая Windows). Эти два слоя являются пустыми операциями на платформах, где binmode() — это пустая операция, но они выполняют свои функции везде, если PerlIO включён.
ДЕТАЛИ РЕАЛИЗАЦИИ
В PerlIO::Layer find есть метод класса, который реализован как XS-код. Он вызывается import для проверки слоёв:
PerlIO::Layer::->find("perlio") Возвращаемое значение (если определено) — это объект Perl класса PerlIO::Layer, созданный C-кодом в perlio.c. Пока в Perl-уровне с этим объектом нельзя ничего полезного сделать.
СМОТРИТЕ ТАКЖЕ
"binmode" в perlfunc, "open" в perlfunc, perlunicode, PerlIO, encoding
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/open