Spec-Zone.ru › Perl 5.36

open

СОДЕРЖАНИЕ

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

ИМЯ

open - pragma perl для установки стандартных слоев PerlIO для ввода и вывода

СИНОПСИС

use open IN  => ':crlf', OUT => ':raw';
open my $in, '<', 'foo.txt' or die "open failed: $!";
my $line = <$in>; # CRLF translated
close $in;
open my $out, '>', 'bar.txt' or die "open failed: $!";
print $out $line; # no translation of bytes
close $out;

use open OUT => ':encoding(UTF-8)';
use open IN  => ':encoding(iso-8859-7)';

use open IO  => ':locale';

# IO implicit only for :utf8, :encoding, :locale
use open ':encoding(UTF-8)';
use open ':encoding(iso-8859-7)';
use open ':locale';

# with :std, also affect global standard handles
use open ':std', ':encoding(UTF-8)';
use open ':std', OUT => ':encoding(cp1252)';
use open ':std', IO => ':raw :encoding(UTF-16LE)';

ОПИСАНИЕ

Полная поддержка слоев ввода-вывода теперь реализована, при условии, что Perl настроен на использование PerlIO в качестве своей системы ввода-вывода (что было значением по умолчанию с версии 5.8 и единственным поддерживаемым конфигурацией с версии 5.16).

Pragma open служит одним из интерфейсов для объявления стандартных «слоев» (ранее известные как «дисциплины») для всего ввода-вывода. Любые операторы open(), readpipe() (также известные как qx//) и аналогичные, найденные в лексическом объеме этого pragma, будут использовать объявленные значения по умолчанию через переменную ${^OPEN}.

Слои указываются с ведущей двоеточием по соглашению. Можно указать стек из нескольких слоёв как строку, разделённую пробелами. Для получения дополнительной информации о доступных слоях см. PerlIO.

С помощью подpragma IN можно объявить стандартные слои входных потоков, а с помощью подpragma OUT — стандартные слои выходных потоков. С помощью подpragma IO (можно опустить для :utf8, :locale, или :encoding ) можно одновременно управлять входными и выходными потоками.

При использовании open() с явным списком слоев (в синтаксисе с тремя аргументами), они переопределяют список, объявленный с помощью данного pragma. open() также может получить одно двоеточие (:) для имени слоя, чтобы переопределить этот pragma и использовать значение по умолчанию, как подробно описано в "Значения по умолчанию и как их переопределить" в PerlIO.

Для преобразования из произвольного кодирования текста в произвольное используйте слой :encoding. Сопоставление имён кодирования в :encoding является нестрогим: регистр не имеет значения, и у многих кодирований есть несколько псевдонимов. См. Encode::Supported для получения подробной информации и списка поддерживаемых локалей.

Если вы хотите установить свои слои кодирования на основе переменных среды locale, вы можете использовать псевдо-слой :locale. Например:

$ENV{LANG} = 'ru_RU.KOI8-R';
# the :locale will probe the locale environment variables like LANG
use open OUT => ':locale';
open(my $out, '>', 'koi8') or die "open failed: $!";
print $out chr(0x430); # CYRILLIC SMALL LETTER A = KOI8-R 0xc1
close $out;
open(my $in, '<', 'koi8') or die "open failed: $!";
printf "%#x\n", ord(<$in>); # this should print 0xc1
close $in;

Логика :locale подробно описана в "Под-pragma :locale" в encoding, но коротко — она сначала пытается получить nl_langinfo(CODESET), а затем делает предположение на основе переменных среды locale LC_ALL и LANG.

:locale также неявно включает :std.

:std не является слоем, но дополнительным под-pragma. При указании в списке импорта он активирует дополнительную функциональность по передаче выбранных слоёв для входных/выходных дескрипторов в стандартные дескрипторы (STDIN, STDOUT, STDERR). Если новые слои и существующий стек слоёв оба заканчиваются слоем :encoding, существующий слой :encoding также будет удалён.

Например, если и ввод, и вывод выбраны как :encoding(UTF-8), :std будет означать, что STDIN, STDOUT и STDERR также будут иметь :encoding(UTF-8) установленным. С другой стороны, если только вывод выбран как :encoding(koi8r), :std заставит только STDOUT и STDERR быть в koi8r.

Эффект :std не лексический, так как он изменяет стек слоёв глобальных дескрипторов. Если вы хотите применить только этот глобальный эффект, а не эффект на дескрипторы, открытые в этом области, вы можете изолировать вызов этого pragma в своей собственной лексической области.

{ use open ':std', IO => ':encoding(UTF-8)' }

До Perl 5.34, :std применял бы только первый слой, при условии, что это либо :utf8, либо он имеет аргумент слоя, например, :encoding(UTF-8). С Perl 5.34 он будет применять тот же стек слоёв, что и предоставляет ${^OPEN}.

ДЕТАЛИ РЕАЛИЗАЦИИ

Есть метод класса в PerlIO::Layer find, который реализован как XS-код. Он вызывается import для проверки слоёв:

PerlIO::Layer::->find("perlio")

Возвращаемое значение (если определено) — это объект Perl класса PerlIO::Layer, созданный кодом C в perlio.c. Пока что с объектом на уровне perl нельзя ничего полезного сделать.

СМОТРИТЕ ТАКЖЕ

"binmode" в perlfunc, "open" в perlfunc, perlunicode, PerlIO, encoding

© 1993–2021 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.36.0/open

Spec-Zone.ru

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