函數名 | pack | ||||||||||||||||||||
調用語法 | formatstr = pack(packformat, list); | ||||||||||||||||||||
解說 | 把一個列表或數組以在實際機器存貯格式或C等編程語言使用的格式轉化(包裝)到一個簡單變量中。參數packformat包含一個或多個格式字符,列表中每個元素對應一個,各格式字符間可用空格或tab隔開,因爲pack忽略空格。 除了格式a、A和@外,重複使用一種格式多次可在其後加個整數,如: $twoints = pack ("i2", 103, 241); 把同一格式應用於所有的元素則加個*號,如: $manyints = pack ("i*", 14, 26, 11, 83); 對於a和A而言,其後的整數表示要創建的字符串長度,重複方法如下: $strings = pack ("a6" x 2, "test1", "test2"); 格式@的情況比較特殊,其後必須加個整數,該數表示字符串必須的長度,如果長度不夠,則用空字符(null)補足,如: $output = pack ("a @6 a", "test", "test2"); pack函數最常見的用途是創建可與C程序交互的數據,例如C語言中字符串均以空字符(null)結尾,創建這樣的數據可以這樣做: $Cstring = pack ("ax", $mystring); 下表是一些格式字符與C中數據類型的等價關係:
|
格式字符 | 描述 |
a | 用空字符(null)補足的字符串 |
A | 用空格補足的字符串 |
b | 位串,低位在前 |
B | 位串,高位在前 |
c | 帶符號字符(通常-128~127) |
C | 無符號字符(通常8位) |
d | 雙精度浮點數 |
f | 單精度浮點數 |
h | 十六進制數串,低位在前 |
H | 十六進制數串,高位在前 |
i | 帶符號整數 |
I | 無符號整數 |
l | 帶符號長整數 |
L | 無符號長整數 |
n | 網絡序短整數 |
N | 網絡序長整數 |
p | 字符串指針 |
s | 帶符號短整數 |
S | 無符號短整數 |
u | 轉化成uuencode格式 |
v | VAX序短整數 |
V | VAX序長整數 |
x | 一個空字節 |
X | 回退一個字節 |
@ | 以空字節(null)填充 |
函數名 | unpack |
調用語法 | @list = unpack (packformat, formatstr); |
解說 | unpack與pack功能相反,將以機器格式存貯的值轉化成Perl中值的列表。其格式字符與pack基本相同(即上表),不同的有:A格式將機器格式字符串轉化爲Perl字符串並去掉尾部所有空格或空字符;x爲跳過一個字節;@爲跳過一些字節到指定的位置,如@4爲跳過4個字節。下面看一個@和X合同的例子: $longrightint = unpack ("@* X4 L", $packstring); 此語句將最後四個字節看作無符號長整數進行轉化。下面看一個對uuencode文件解碼的例子: 1 : #!/usr/local/bin/perl當將pack和unpack用於uuencode時,要記住,雖然它們與UNIX中的uuencode、uudecode工具算法相同,但並不提供首行和末行,如果想用uudecode對由pack的輸出創建的文件進行解碼,必須也把首行和末行輸出(詳見UNIX中uuencode幫助)。 |