Encode::Encoder -- 物件導向編碼器
use Encode::Encoder;
# Encode::encode("ISO-8859-1", $data);
Encode::Encoder->new($data)->iso_8859_1; # OOP way
# shortcut
use Encode::Encoder qw(encoder);
encoder($data)->iso_8859_1;
# you can stack them!
encoder($data)->iso_8859_1->base64; # provided base64() is defined
# you can use it as a decoder as well
encoder($base64)->bytes('base64')->latin1;
# stringified
print encoder($data)->utf8->latin1; # prints the string in latin1
# numified
encoder("\x{abcd}\x{ef}g")->utf8 == 6; # true. bytes::length($data)
Encode::Encoder 讓您能以物件導向的方式使用 Encode。這不僅比函數式方法更直覺,而且在您想要堆疊編碼時也更方便。假設您想要將 UTF-8 字串轉換為 Latin1 再轉換為 Base64:您可以簡單地說
my $base64 = encoder($utf8)->latin1->base64;
而不是
my $latin1 = encode("latin1", $utf8);
my $base64 = encode_base64($utf8);
或更懶惰、更複雜的
my $base64 = encode_base64(encode("latin1", $utf8));
以下是此模組的使用方式。
至少有兩個實例變數儲存在雜湊參考中,{data} 和 {encoding}。
當沒有方法時,它會將方法名稱視為編碼名稱,並使用 encoding 編碼實例 data。如果成功,實例 encoding 會相應地設定。
您可以透過 ->data 擷取結果,但通常您不必這麼做,因為字串化運算子("")已被覆寫為執行完全相同的動作。
此模組預定義以下方法
傳回一個編碼器物件。如果存在,其資料會用 $data 初始化,如果存在,其編碼會設定為 $encoding。
當遺漏 $encoding 時,如果 $data 已為 utf8,則預設為 utf8,否則為 ""(空字串)。
是 Encode::Encoder->new() 的別名。此別名會依需求匯出。
當 $data 存在時,將執行個體資料設定為 $data 並傳回物件本身。否則,傳回目前的執行個體資料。
當 $encoding 存在時,將執行個體編碼設定為 $encoding 並傳回物件本身。否則,傳回目前的執行個體編碼。
從 $encoding 解碼執行個體資料,如果遺漏則解碼執行個體編碼。如果轉換成功,執行個體編碼會設定為 ""。
名稱 bytes 是經過深思熟慮的選擇,以避免名稱空間污染——此模組可用作基底類別,因此避免使用出現在 Encode::Encoding 中的方法名稱。
此模組設計為與 Encode::Encoding 搭配使用。若要讓上述的 Base64 轉碼器範例真正發揮作用,您可以撰寫類似這樣的模組
package Encode::Base64;
use parent 'Encode::Encoding';
__PACKAGE__->Define('base64');
use MIME::Base64;
sub encode{
my ($obj, $data) = @_;
return encode_base64($data);
}
sub decode{
my ($obj, $data) = @_;
return decode_base64($data);
}
1;
__END__
而呼叫您的模組會類似這樣
use Encode::Encoder;
use Encode::Base64;
# now you can really do the following
encoder($data)->iso_8859_1->base64;
encoder($base64)->bytes('base64')->latin1;
此模組重載了兩個運算子,字串化 ("") 和數字化 (0+)。
字串化會傾印物件內的資料。
數字化會傳回執行個體資料中的位元組數。
當您想要列印或找出資料大小時,它們會派上用場。