Spec-Zone.ru › Perl 5.34

bytes

СОДЕРЖАНИЕ

  • ИМЯ
  • ЗАМЕЧАНИЕ
  • СИНОПСИС
  • ОПИСАНИЕ
  • ОГРАНИЧЕНИЯ
  • СМОТРИТЕ ТАКЖЕ

ИМЯ

bytes - Perl-pragma для отображения отдельных байтов символов

ЗАМЕЧАНИЕ

Поскольку pragma bytes нарушает инкапсуляцию (т. е. раскрывает внутреннее представление строки в текущей реализации perl), значения байтов имеют неопределённое кодирование.

Использование данного модуля в целях, отличных от отладки, строго не рекомендуется. Если вам кажутся полезными функции этого модуля, это может указывать на несоответствие вашего представления о Perl Unicode текущей реализации. В этом случае ознакомьтесь с документацией по Perl Unicode: perluniintro, perlunitut, perlunifaq и perlunicode.

СИНОПСИС

use bytes;
... chr(...);       # or bytes::chr
... index(...);     # or bytes::index
... length(...);    # or bytes::length
... ord(...);       # or bytes::ord
... rindex(...);    # or bytes::rindex
... substr(...);    # or bytes::substr
no bytes;

ОПИСАНИЕ

Символы в Perl хранятся во внутренней форме как последовательности одного или нескольких байтов. Данный pragma позволяет просмотреть отдельные байты, которые составляют символ.

Изначально pragma был разработан с более глобальной целью включения Unicode в Perl, но подход, который его использовал, оказался ошибочным, и единственное законное применение — отладка, когда нужно неразрушающим образом изучить отдельные байты символа. Просто временно вставьте pragma и удалите его после завершения отладки.

Оригинальное применение может быть достигнуто с явным (вместо неявного) кодированием, используя модуль Encode:

use Encode qw/encode/;

my $utf8_byte_string   = encode "UTF8",   $string;
my $latin1_byte_string = encode "Latin1", $string;

Или, если нужна производительность и вас интересует только представление UTF-8:

utf8::encode(my $utf8_byte_string = $string);

no bytes может быть использовано для отмены действия use bytes в текущем лексическом пространстве.

Например, когда Perl видит $x = chr(400), он кодирует символ в UTF-8 и сохраняет его в $x. Затем он помечается как символьные данные, поэтому, например, length $x возвращает 1. Однако в области действия pragmy bytes, $x рассматривается как последовательность байтов — байты, составляющие кодировку UTF8, и length $x возвращает 2.

$x = chr(400);
print "Length is ", length $x, "\n";     # "Length is 1"
printf "Contents are %vd\n", $x;         # "Contents are 400"
{
    use bytes; # or "require bytes; bytes::length()"
    print "Length is ", length $x, "\n"; # "Length is 2"
    printf "Contents are %vd\n", $x;     # "Contents are 198.144 (on
                                         # ASCII platforms)"
}

chr(), ord(), substr(), index() и rindex() ведут себя аналогично.

Для более подробной информации см. perluniintro и perlunicode.

bytes::length() безусловно, полезно, если нужно узнать длина в байтах скалярной переменной Perl. Но более современный способ:

use Encode 'encode';
length(encode('UTF-8', $scalar))

ОГРАНИЧЕНИЯ

bytes::substr() не работает как lvalue().

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

perluniintro, perlunicode, utf8, Encode

© 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.34.0/bytes

Spec-Zone.ru

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