bytes - Perl pragma 用於顯示字元的個別位元組
由於 bytes pragma 會破壞封裝(例如,它會顯示 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() 運作。