Spec-Zone.ru › Perl 5.36

байты

СОДЕРЖАНИЕ

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

НАЗВАНИЕ

bytes - Perl-псевдоним для доступа к отдельным байтам символов

ЗАМЕЧАНИЕ

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

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

Изначально псевдоним был разработан для более масштабной цели – помочь интегрировать Unicode в 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–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/bytes

Spec-Zone.ru

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