広告
広告
配列か値のリストをとり、バイナリの構造体に入れてその構造体を含む文字列を返します。TEMPLATE は以下のような値の型と順番を指定する文字を並べたものとなります。
a | ASCII 文字列、ヌル文字で埋める |
---|---|
A | ASCII 文字列、スペース文字で埋める |
b | ビット列 (昇ビット順、vec() と同じ) |
B | ビット列 (降ビット順) |
h | 16 進数文字列 (低位ニブルが先) |
H | 16 進数文字列 (高位ニブルが先) |
c | signed char 値 |
C | unsigned char 値 |
s | signed short 値 |
S | unsigned short 値 |
i | signed int 値 |
I | unsigned int 値 |
l | signed long 値 |
L | unsigned long 値 |
n | "network" 順序 (ビッグエンディアン) の short |
N | "network" 順序 (ビッグエンディアン) の long |
v | "VAX" 順序 (リトルエンディアン) の short |
V | "VAX" 順序 (リトルエンディアン) の long |
f | 機種依存の単精度浮動小数点数 |
d | 機種依存の倍精度浮動小数点数 |
p | ヌル文字で終端する文字列へのポインタ |
P | 構造体 (固定長文字列) へのポインタ |
u | uuencode 文字列 |
x | ヌル文字 |
X | 1 文字後退 |
@ | 絶対位置までヌル文字で埋める |
これらの文字の後には繰り返し数を示す数字を付けることができます。"a"、"A"、"b"、"B"、"h"、"H" 以外の型を使うとき、pack 関数はLIST からその数の値を取り出して使います。くり返し数に * を指定するとその時点で残っているすべての要素を意味します。"a" や"A" という型を使うと値を一つだけ取り出して使いますが、繰り返し数で示す長さの文字列となるように必要に応じて NULL 文字かスペース文字を付け足します。unpack するとき"A" は後続のスペース文字やヌル文字を取り除きますが、"a" はそのままにします。同様に"b" や"B" は繰り返し数で示すビット長のビット列に pack します(LIST から要素を 1 つだけ取り出しその要素を文字列と見て各文字の下位 1 ビットづつを取り出して pack /最終的に半端なビットは 0 で埋められる)。"h" や "H" は、そのニブル長のニブル列に pack します。"P" は、指定した長さの構造体へのポインタを pack します。実数 (float と double) は、機種依存のフォーマットしかありません。いろんな浮動小数点数のフォーマットが在り標準的な表現といったものがないため、データ交換のための機能は用意されていません。つまりあるマシンで pack した浮動小数点数は別のマシンでは読めないかもしれないということになります。たとえ双方で IEEE フォーマットの浮動小数点数演算を行なっていても同様(IEEE の仕様ではメモリ表現上のバイト順序までは規定されていないから)。Perl ではすべての数値演算のために内部的に double を使用しています。double から float へ変換し、それから再び double に戻すと精度が落ちることになります。一般にはpack で使用したものと同じテンプレートがunpack 関数でも使用できます。
$foo = pack("cccc",65,66,67,68); print "$foo\n"; $foo = pack("c4",65,66,67,68); print "$foo\n"; $foo = pack("ccxxcc",65,66,67,68); print "$foo\n"; $foo = pack("s2",1,2); print "$foo\n"; $foo = pack("a4","abcd","x","y","z"); print "$foo\n"; $foo = pack("aaaa","abcd","x","y","z"); print "$foo\n"; $foo = pack("a14","abcdefg"); print "$foo\n";
ABCD ABCD AB\0\0CD \1\0\2\0 abcd axyz abcdefg\0\0\0\0\0\0\0
広告