chr(65)
は ASCII では "A" となります。
time
関数が返す時刻を、グリニッジタイムゾーンで測った時刻として、
9 要素の配列に変換します。通常は、
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
のようにして使用します。
すべての配列要素は数値で、tm 構造体から直接持ってきます。これは特に、 $mon が 0..11 の範囲で、$wday が 0..6 の範囲となるということです。 expr が省略されると、gmtime(time()) を行ないます。
oct()
を参照してください。) expr
が省略されると、$_ を使用します。
time
関数が返す時刻を、ローカルなタイムゾーンで測った時刻として、
9 要素の配列に変換します。通常は、
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
のようにして使用します。
すべての配列要素は数値で、tm 構造体から直接持ってきます。これは特に、
$mon が 0..11 の範囲で、$wday が0..6 の範囲となるということです。
expr が省略されると、localtime(time())
を行ないます。
スカラコンテキストでは、ctime(3) の値を返します:
$now_string = localtime; # 例 "Thu Oct 13 04:54:34 1994"
See section モジュール,の timelocal
の項や POSIX モジュールによって使用
できる strftime(3) 関数も参照してください。(訳注: と書いてあるが、
See section モジュール,に timelocal
はない。)
$val = oct($val) if $val =~ /^0/;
expr を省略すると、$_ を使用します。
これらの文字の後には、繰り返し数を示す数字を付けることができます。"a"、
"A"、"b"、"B"、"h"、"H" を以外の型を使うとき、pack
関数は、
list からその数の値を取り出して使います。くり返し数に * を指定する
と、その時点で残っているすべての要素を意味します。"a" や"A" という型を使
うと、値を一つだけ取り出して使いますが、繰り返し数で示す長さの文字列とな
るように、必要に応じてヌル文字かスペース文字を付け足します。(unpackする
とき、"A" は後続のスペース文字やヌル文字を取り除きますが、"a" はそのまま
にします。)同様に、"b" や"B" は、繰り返し数で示すビット長のビット列に
pack
します。(訳注: list から要素を 1 つだけ取り出し、その
要素を文字列と見て、各文字の下位 1 ビットづつを取り出して pack
し
ます。最終的に半端なビットは 0 で埋められます。) "h" や "H" は、そのニブ
ル長のニブル列に pack
します。"P" は、指定した長さの構造体へのポ
インタを pcide{pack} します。実数 (float と double) は、機種依存のフォー
マットしかありません。いろんな浮動小数点数のフォーマットが在り、標準的な
"network" 表現といったものがないため、データ交換のための機能は用意してあ
りません。つまり、あるマシンで pack
した浮動小数点数は、別のマシ
ンでは読めないかもしれないということです。たとえ双方で IEEE フォーマット
の浮動小数点数演算を行なっていてもです (IEEE の仕様では、メモリ表現上の
バイト順序までは、規定されていないからです)。Perl では、(訳注: 特に指定
しない限り) すべての数値演算のために、内部的に double を使用しています。
double から float へ変換し、それから再び double に戻すと精度が落ちること
になります (つまり、unpack("f", pack("f", $foo))
は、一般には
$foo と同じではないということです)。
例:
$foo = pack("cccc",65,66,67,68); # $foo eq "ABCD" $foo = pack("c4",65,66,67,68); # 同じ $foo = pack("ccxxcc",65,66,67,68); # $foo eq "AB\0\0CD" $foo = pack("s2",1,2); # リトルエンディアンでは、"\1\0\2\0" # ビッグエンディアンでは、"\0\1\0\2" $foo = pack("a4","abcd","x","y","z"); # "abcd" $foo = pack("aaaa","abcd","x","y","z"); # "axyz" $foo = pack("a14","abcdefg"); # "abcdefg\0\0\0\0\0\0\0" $foo = pack("i9pl", gmtime); # 実際の struct tm (とにかく私のシステムでは) sub bintodec { unpack("N", pack("B32", substr("0" x 32 . shift, -32))); }
一般には、pack
で使用したものと同じテンプレートが、unpack
関数でも使用できます。
unpack
は pack
の逆を行ないます: 構造体を表わす文字列をと
り、リスト値に展開し、その配列値を返します。(スカラコンテキストでは、単
に最初の値を返します。) template は、pack
関数と同じフォー
マットを使います。部分文字列を取り出すうサブルーティンの例を示します:
sub substr { local($what,$where,$howmuch) = @_; unpack("x$where a$howmuch", $what); }
そして、
sub ordinal { unpack("c",$_[0]); } # ord() と同じ
ということもできます。
さらに、フィールドの前に %<数値> というものを付けて、項目自身の代わりに、 その項目の <数値>-ビットのチェックサムを計算させることができます。デフォ ルトは、16-ビットチェックサムです。たとえば、
while (<>) { $checksum += unpack("%16C*", $_); } $checksum %= 65536;
は、System V の sum プログラムと同じ値を計算します。
また、
$setbits = unpack("%32b*", $selectmask);
は、効率的に、ビットベクターの設定されているビットを数えるものです。
vec()
で作られたベクターは、論理演算子 |、&、^ で扱うこともできま
す。これらの演算子は、両方の被演算子に文字列を使うと、ビットベクター演算
を行ないます。
ビットベクターを、0 と 1 の文字列や配列に変換するには、
$bits = unpack("b*", $vector); @bits = split(//, unpack("b*", $vector));
のようにします。ビット長が分かっていれば、* の代わりにその長さを使うこと ができます。
Go to the first, previous, next, last section, table of contents.