pack TEMPLATE, LIST
第2引数LISTをバイナリの構造体にパックしたものを文字列をして返します。第1引数TEMPLATEはフォーマット文字を並べて、値の順番と型を示すようにしたものです。
フォーマット文字には次のものがあります。
| フォーマット | 意味 | 
|---|---|
| a | ASCII 文字列 | 
| A | ASCII 文字列、足りない領域はスペース文字で埋める | 
| b | ビット列 (昇ビット順) | 
| B | ビット列 (降ビット順) | 
| c | 符号付き char 値 | 
| C | 符号なし char 値 | 
| d | 機種依存の倍精度浮動小数点数 | 
| f | 機種依存の単精度浮動小数点数 | 
| h | 16進数文字列 (下位ビットが先) | 
| H | 16進数文字列 (上位ビットが先) | 
| i | 符号付き int 値 | 
| I | 符号なし int 値 | 
| l | 符号付き long 値 | 
| L | 符号なし long 値 | 
| n | ネットワークバイト順序 (ビッグエンディアン) の short 値 | 
| N | ネットワークバイト順序 (ビッグエンディアン) の long 値 | 
| p | 文字列へのポインタ | 
| P | 構造体 (固定長文字列) へのポインタ | 
| s | 符号付き short 値 | 
| S | 符号なし short 値 | 
| v | VAXバイト 順序 (リトルエンディアン) の short 値 | 
| V | VAXバイト 順序 (リトルエンディアン) の long 値 | 
| u | uuencode した文字列 | 
| x | ヌル文字 | 
| X | 1バイト後退 | 
| @ | 絶対位置までヌル文字で埋める | 
フォーマット文字の使い方
- フォーマット文字の後ろには、それを何回繰り返すかを示す数字COUNTを付けることができます。
- COUNTに * を指定すると、残っているすべての要素を使います。
- フォーマット文字(COUNTも含める)同士の間にはスペースを挟むことができます。
- a、- A、- b、- B、- h、- H以外のフォーマットは、第2引数- LISTから- COUNTで指定された分の値を使います。
- aや- Aというフォーマットに対して- COUNTを使うと、繰り返し数で示す長さの文字列となるように、必要に応じてヌル文字かスペース文字を付け足します。- unpackするとき、- Aは後続のスペース文字やヌル文字を取り除きますが、- aはそのままにします。
 同様に、- bや- Bは、繰り返し数で示すビット長のビット列にパックします。
- hや- Hは、そのニブル長のニブル列にパックします。
- Pは、指定した長さの構造体へのポインタをパックします。実数 (- floatと- double) は、機種依存のフォーマットしかありません。あるマシンで
 パックした浮動小数点数は、別のマシンでは読めない可能性があります。
Perlは、すべての数値演算で内部的にdoubleを使用しています。ですから、doubleからfloatへ変換し、それから再びdoubleに戻すと精度が落ちることになります (unpack("f",pack("f", $foo)) は、$fooと同じではありません)。
packの使い方
# 次の2行は数値をパックしてバイトの並びにします。
print pack("cccc",65,66,67,68), "\n";
> ABCD
print pack("c4",65,66,67,68), "\n";
> ABCD
# "a" フィールドの長さ指定は、1つの文字だけに適用されます
print pack("a4","abcdefg","X","Y","Z"), "\n";
> abcd
# 上記の制限を回避するには、"a"フィールドを繰り返します
print pack("a" x 4, "abcdefg","X","Y","Z"), "\n";
> aXYZ
# "a" フォーマットは、長さが足りない分をヌル文字で補います
print pack("A14","abcdefg"), "...\n";
> abcdefg          ... 
packで使用したものと同じテンプレートが、unpack関数でも使用できます。