最近在看perlpacktut的document,整理了下面的文章,
希望對大家有幫助,瞭解pack/unpack怎麼用...
還沒寫完..後面跟C有關係..
======================================
Pack 與unpack使用說明:
資料?碓凑詐erlpacktut,初學perl的時候,想必大家對於pack與unpack都不是很瞭解,因此本人擷取perldoc裡面的文章,為各位簡單說明pack與unpack的使用方法:首先定義一下pack與unpack:pack可視為將一系列的片段的數值打包在一起,可用於對dev檔案、socket、memory的讀寫,因為這些需要一塊完整的memory,而且需要事先打包成特定格式;而unpack可以視為將將這些完整的 memory切割計算,取得我們所需要各部分的Variable。例子如下:
print pack(“H2”x10,map{ “3$_” } (0..9);
得到
0123456789
因為ASCII中30~39代表數字0-9。所以pack後可以得到ascii編碼的0->9,而我們可以利用unpack將string作逆向操作。
print unpack(“H*”,”0123456789”);
得到
30313233343536373839
同樣的作法可以用在中文字中,至是你要注意OS的編碼格式,UTF-8、GB2312、Big5得到的數值?K不會相同。
Pack與unpack也可以用在對於對於固定格式的文件作處理的情形下:
代码:
Date |Description | Income|Expenditure
01/24/2001 Ahmed's Camel Emporium 1147.99
01/28/2001 Flea spray 24.99
01/29/2001 Camel rides to tourists 235.00
看到上面格式,想必大家很多人都用用substr將固定欄位中的字串取出?恚蚶糜悬c點複雜的Regular Expression將上面的文件欄位匹配出?恚鴮?際上我們要將上面欄位一個一個匹配出?砜梢杂靡恍懈愣╘
例子:
while(<FF>){
my($date,$desc,$income,$expend) = unpack(“A10xA27xA7xA*”);
}
簡單說明:A表示ASCII,A10表示10個ASCII character,x表示null byte也等於skip a byte,也就是說我們要跳過一個char(|),然後接著27個ASCII char,然後跳過一個vhar,再接上7個ASCII,在跳過一個char,最後A*表示不管後面char有多少個,我全含括進?怼
這樣子就可以得到各個欄位相對應的資料,很簡單吧!:) 不需要什麼太多的技巧,一行搞定。之後將income與expend作加總,得到total_income、total_expend,數值,然後再輸出的時候,如果也要格式對稱,要怎麼辦?大多數人都會用format或sprintf,然後一行一行很辛苦的,將結果輸出。其