bytes - Perl 编译指令,用于暴露字符的单个字节
由于 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,并在调试完成后将其删除。
原始用法可以通过显式(而不是此 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
。但是,在 bytes
pragma 的范围内,$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() 工作。