Spec-Zone.ru › Perl 5.30

bytes

СОДЕРЖАНИЕ

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

ИМЯ

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

ЗАМЕЧАНИЕ

Поскольку pragma 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 хранятся внутри как последовательности одного или более байтов. Этот pragma позволяет просматривать отдельные байты, которые вместе составляют символ.

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

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

Spec-Zone.ru

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