Perl入門 ≫ LESSON14 変換関数
変換関数
Perlでは、データを変換する関数が用意されています。
ここでは10以外の基数をとる数字を使用しますので、わからない人は『スカラー:数値」の所を参照してください。
●chr
chr(10進数値)
10進数値のコードに対応する文字を返します。
my $k = chr(102);
print "$k";
結果
f
●ord
ord(文字列)
文字列の最初の文字の数値としての値を返します。
my $k = ord("fa");
print "$k";
結果
102

コンピュータの中では、全ての情報は0と1で表されます。 と言っても数字の0と1ではなくて、ビットが立っているか立っていないか、あるかないか、という2種類の対する状態を組み合わせて、各数値も文字も認識されています。
#今後も、便宜上『0と1』と説明します。
例えば、上の例で使った'f'という文字ですが、これはコンピュータの中では1010110と表現されます。
では、これを2進数とみなし、8進数に表現すると0146(Oct)、16進数に表現すると0x66(Hex)となります。 10進数では102です。
ここで、『スカラー:文字』のところで出てきた8進・16進で文字コードを指定することを思い出してください。
print "\x66";
print "\146";
両方'f'と表現されます。
●oct
oct(8進数文字列)
8進数文字列を解釈してその10進数値を返します。
8進数は数字の最初に0を付けて表現します。
ただし、文字列が0xではじまっていれば16進文字列として解釈し、0bではじまっていれば2進数文字列として解釈します。
#146(8進数)を解釈する。
my $k = oct(146);
print "$k\n";
#0146(8進数)=102(10進数)を更に8進数として解釈する。
$k = oct(0146);
print "$k";
結果
102
66
●hex
hex(16進数文字列)
16進数文字列を解釈してその10進数値を返します。
16進数は数字の最初に0xを付けて表現します。
ただし、文字列は0xではじまっていなくてもいいです。16進数として解釈されます。
#66(16進数)を解釈する。
my $k = hex(66);
print "$k\n";
#0x66(16進数)=102(10進数)を更に16進数として解釈する。
$k = hex(0x66);
print "$k";
結果
102
258
●pack
pack(テンプレート,リスト)
指定されたテンプレートに従って、リストで与えられる値を連続したバイト列に変換します。
結果のバイト列を文字列として返します。
テンプレートは以下の文字の組み合わせで表現されます。
リピート値として * を使うと残り全部を示します。
a / A | アスキー文字列(余白をNull / 空白文字で埋める) |
---|---|
b / B | 昇順/降順のビット列 |
c / C | 符号付き/符号なしのbyte値 |
f / d | ネイティブフォーマットの単精度/倍精度浮動少数点数 |
h / H | 16進数文字で、上位/下位nybble優先 |
i / I | 符号付き/符号なしのint値 |
l / L | 符号付き/符号なしのlong値 |
n / N | ネットワークバイト順(Big Endien)のshort/logn値 |
p / P | Null終了/固定長 文字列ポインタ |
q / Q | 符号付き/符号なしのquad値 |
s / S | 符号付き/符号なしのshort値 |
u / U | Uuencodeデータ/Unicode UTF-8文字 |
v/ V | VAXバイト順(Little Endien)のshort/logn値 |
w | BER符号化整数 |
x / X | ヌルバイト(順方向)/1バイト戻る |
Z / @ | ヌル終了文字列/ヌル詰め |
#先ほどやった'f'を出してみる。
my $k = pack("CCC",102,102,102);
#他の文字列を出す。"C6"でもおっけー。
my $k1 = pack("C*",115,97,109,112,108,101);
print "$k $k1";
結果
fff sample
pack("CCC",102,102,102)は、テンプレートCCCにそれぞれリストの値を入れればいいのだから、最初のCにリストの最初である102を,次のCには2番目のリスト値である102,最後のCにはりストの最後の値である102を入れて、結果のバイト列を文字列として返しています。
●unpack
unpack(テンプレート,文字列)
テンプレートに従って、文字列の連続したバイト列をリストに展開します。
ちょうどpackと逆のことをします。
フォーマットの先頭に%nがついている場合、unpackはnビットのチェックサムを返します。
#'e','f','g'を展開する。
my $v = "efg";
my @k = unpack("C*",$v);
print "@k\n";
#小文字を大文字に変換する。
$v = 'abcdefghijklmnopqrstuvqxyz';
@k = unpack("C*",$v);
foreach (@k) {
$_ = $_ - 32;
}
my $new = pack("C*",@k);
print "$new";
結果
101 102 103
ABCDEFGHIJKLMNOPQRSTUVQXYZ
*pack,unpackについては使う時にまたそれぞれ説明します。