Spec-Zone.ru › Perl 5.28

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 в качестве своей системы ввода-вывода (что теперь является стандартным).

Пragma open служит одним из интерфейсов для объявления по умолчанию «слоев» (также известных как «дисциплины») для всех операций ввода-вывода. Любые операторы open(), readpipe() (также известные как qx//) и подобные, находящиеся в лексическом пространстве действия этого pragmа, будут использовать объявленные значения по умолчанию. Даже трехаргументные open могут быть затронуты этим pragma, когда они не указывают слои ввода-вывода в MODE.

С помощью подpragma IN вы можете объявить значения по умолчанию для входных потоков, а с помощью подpragma OUT вы можете объявить значения по умолчанию для выходных потоков. С помощью подpragma IO вы можете одновременно управлять входными и выходными потоками.

Если у вас есть устаревшая кодировка, вы можете использовать тег :encoding(...).

Если вы хотите установить слои кодировки на основе переменных среды локального языка, вы можете использовать тег :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() получает явный список слоев (с синтаксисом с тремя аргументами), они переопределяют список, объявленный с помощью данного pragma. 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.28.3/open

Spec-Zone.ru

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