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 / H16進数文字で、上位/下位nybble優先
i / I符号付き/符号なしのint値
l / L符号付き/符号なしのlong値
n / Nネットワークバイト順(Big Endien)のshort/logn値
p / PNull終了/固定長 文字列ポインタ
q / Q符号付き/符号なしのquad値
s / S符号付き/符号なしのshort値
u / UUuencodeデータ/Unicode UTF-8文字
v/ VVAXバイト順(Little Endien)のshort/logn値
wBER符号化整数
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については使う時にまたそれぞれ説明します。

ページのトップへ戻る