байты
СОДЕРЖАНИЕ
НАЗВАНИЕ
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