Go to the first, previous, next, last section, table of contents.


変換関数

Function: chr number
特定の文字セットでの NUMBER で表わされる文字を返す。たとえば、 chr(65) は ASCII では "A" となります。

Function: gmtime expr
time 関数が返す時刻を、グリニッジタイムゾーンで測った時刻として、 9 要素の配列に変換します。通常は、
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);

のようにして使用します。

すべての配列要素は数値で、tm 構造体から直接持ってきます。これは特に、 $mon が 0..11 の範囲で、$wday が 0..6 の範囲となるということです。 expr が省略されると、gmtime(time()) を行ないます。

Function: hex expr
expr を 16 進数の文字列と解釈して、10 進数の値を返します。(0 や 0x で始まる文字列の解釈には、oct() を参照してください。) expr が省略されると、$_ を使用します。

Function: localtime 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 はない。)

Function: oct expr
expr を 8 進数文字列と解釈して、10 進数の値を返します。(expr が 0x で始まるときには、16 進数文字列と解釈します。)以下の例は、標準的な Perl や C の記法での 10 進数、8 進数、16 進数を扱います:
$val = oct($val) if $val =~ /^0/;

expr を省略すると、$_ を使用します。

Function: ord expr
expr の最初の文字の ASCII 値を返します。expr を省略した場合 には、$_ を使用します。

Function: pack template,list
配列か値のリストをとり、バイナリの構造体に入れ、その構造体を含む文字列を 返します。template は、以下のような値の型と順番を指定する文字を並 べたものです:

これらの文字の後には、繰り返し数を示す数字を付けることができます。"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 関数でも使用できます。

Function: unpack template,expr
unpackpack の逆を行ないます: 構造体を表わす文字列をと り、リスト値に展開し、その配列値を返します。(スカラコンテキストでは、単 に最初の値を返します。) 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);

は、効率的に、ビットベクターの設定されているビットを数えるものです。

Function: vec expr,offset,bits
文字列 expr を unsigned int のベクターとして扱い、offsetbits で指定されるビットフィールドの値を返します。左辺値として、代 入の対象にすることもできます。BIT は、1 から 32 までの 2 のべきを値とし て使うことができます (1, 2, 4, 8, 16, 32)。

vec() で作られたベクターは、論理演算子 |、&、^ で扱うこともできま す。これらの演算子は、両方の被演算子に文字列を使うと、ビットベクター演算 を行ないます。

ビットベクターを、0 と 1 の文字列や配列に変換するには、

$bits = unpack("b*", $vector);
@bits = split(//, unpack("b*", $vector));

のようにします。ビット長が分かっていれば、* の代わりにその長さを使うこと ができます。


Go to the first, previous, next, last section, table of contents.

検索式: