Spec-Zone.ru › Perl 5.30

open

СОДЕРЖАНИЕ

  • ИМЯ
  • СИНОПСИС
  • ОПИСАНИЕ
  • ФУНКЦИОНАЛЬНОСТЬ NONPERLIO
  • ДЕТАЛИ РЕАЛИЗАЦИИ
  • СМОТРИТЕ ТАКЖЕ

ИМЯ

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API