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