Spec-Zone.ru › Perl 5.28

bytes

СОДЕРЖАНИЕ

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

ИМЯ

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

ПРИМЕЧАНИЕ

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

Использование данного модуля для целей, отличных от отладки, настоятельно не рекомендуется. Если вам кажется, что функции в нём могут быть полезны для вашего приложения, это, возможно, указывает на несоответствие между вашей моделью представления Юникода Perl и текущей реальностью. В этом случае вы можете ознакомиться с документацией по Юникоду Perl: 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 хранятся во внутренней памяти как последовательности одного или нескольких байтов. Эта прагма позволяет исследовать отдельные байты, которые вместе составляют символ.

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

Исходное использование может быть реализовано с явным (а не неявным с помощью этой прагмы) кодированием с помощью модуля 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. Однако в области действия прагмы 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–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/bytes

Spec-Zone.ru

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