文字列の整形
■この章で解説する組み込み関数
sprintf
■この章でできること
・文字列を整形する
・数値を文字列に変換する
・浮動小数点数を文字列に変換する
・アドレスの値を文字列に変換する

 文字列を整形するにはsprintf関数を使います。数値や文字列などを指定したフォーマットに従った文字列に整形することができます。使い方はC言語のsprintf関数とほぼ同じです。データ型の指定子には以下のものがあります。

コード
意味
d
10進整数
u
符号なし10進整数
o
8進整数
x
16進整数
X
16進整数(大文字)
ld
10進整数(long)
lu
符号なし10進整数(long)
lo
8進整数(long)
lx
16進整数(long)
lX
16進整数(long 大文字)
e
浮動小数点数(指数形式)
E
浮動小数点数(大文字Eを使った指数形式)
f
浮動小数点数(固定小数点形式)
g
浮動小数点数(コンパクト形式)
G
浮動小数点数(大文字Eを使ったコンパクト形式)
%
パーセント記号
c
文字
s
文字列
p
値が置かれているアドレス(16進数)

sprintf
指定したフォーマットに従って文字列を整形する。
書式
sprintf format, list
引数
format:
フィールド指定子を埋め込んだ文字列
list:
各フィールドを置き換える要素
戻り値
フォーマットに従って整形された文字列

 では、実際の使い方です。まずは整数関連のサンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# 文字列の整形のサンプル1
# Author: "Perl Programming Tips"
#############################################

# 10進整数
print sprintf("sprintf01: %d\n", 45);
print sprintf("sprintf02: %d\n", -45);
print sprintf("sprintf03: %d\n", 100000);
# 8進整数
print sprintf("sprintf04: %o\n", 45);
# 符号なし10進整数
print sprintf("sprintf05: %u\n", 45);
print sprintf("sprintf06: %u\n", -45);
# 16進整数
print sprintf("sprintf07: %x\n", 45);
# 16進整数(大文字)
print sprintf("sprintf08: %X\n", 45);
print "\n";

# 10進整数(long)
print sprintf("sprintf09: %ld\n", 45);
print sprintf("sprintf10: %ld\n", -45);
print sprintf("sprintf11: %ld\n", 100000);
# 8進整数(long)
print sprintf("sprintf12: %lo\n", 45);
# 符号なし10進整数(long)
print sprintf("sprintf13: %lu\n", 45);
print sprintf("sprintf14: %lu\n", -45);
# 16進整数(long)
print sprintf("sprintf15: %lx\n", 45);
# 16進整数(long 大文字)
print sprintf("sprintf16: %lX\n", 45);
print "\n";

# 10進整数(桁数を指定)
print sprintf("sprintf17: %4d\n", 45);
# 10進整数(桁数と0埋めを指定)
print sprintf("sprintf18: %04d\n", 45);

 実行結果は次のようになります。

[g@630m pl]$ perl scalar05_01.pl
sprintf01: 45
sprintf02: -45
sprintf03: 100000
sprintf04: 55
sprintf05: 45
sprintf06: 4294967251
sprintf07: 2d
sprintf08: 2D

sprintf09: 45
sprintf10: -45
sprintf11: 100000
sprintf12: 55
sprintf13: 45
sprintf14: 4294967251
sprintf15: 2d
sprintf16: 2D

sprintf17:   45
sprintf18: 0045
[g@630m pl]$

 整数はd、u、o、xとそれらのlong版のld、lu、lo、lxがあります。しかし出力を見るとlong版との違いはないようです。符号なし10進数でマイナスの値を指定した場合は、最大値から引いた値になります。

 10進整数で桁数を指定する場合は、%mdという形式で指定します。この場合、空の桁はスペースで表示されますが、mの前に0を指定すると0埋めされます。

 次は浮動小数点数関連と、その他のフォーマットです。

#!/usr/bin/perl

#############################################
# 文字列の整形のサンプル2
# Author: "Perl Programming Tips"
#############################################

# 浮動小数点数(指数形式)
print sprintf("sprintf01: %e\n", 45.6);
# 浮動小数点数(大文字Eを使った指数形式)
print sprintf("sprintf02: %E\n", 45.6);
# 浮動小数点数(固定小数点形式)
print sprintf("sprintf03: %f\n", 45.6);
print sprintf("sprintf04: %f\n", 45);
# 浮動小数点数(コンパクト形式)
print sprintf("sprintf05: %g\n", 45.6);
print sprintf("sprintf06: %g\n", 100e+100);
# 浮動小数点数(大文字Eを使ったコンパクト形式)
print sprintf("sprintf07: %G\n", 45.6);
print sprintf("sprintf08: %G\n", 100e+100);
print "\n";

# 浮動小数点数(桁数を指定)
print sprintf("sprintf09: %.3f\n", 45.6);
print "\n";

# パーセント記号
print sprintf("sprintf10: %%%d\n", 45);
# 文字
print sprintf("sprintf11: %c\n", 68);
# 文字列
print sprintf("sprintf12: %s\n", "Hello!");
# アドレス
print sprintf("sprintf13: %p\n", 2);
print sprintf("sprintf14: %p\n", $addr);

 実行結果は次のようになります。

[g@630m pl]$ perl scalar05_02.pl
sprintf01: 4.560000e+01
sprintf02: 4.560000E+01
sprintf03: 45.600000
sprintf04: 45.000000
sprintf05: 45.6
sprintf06: 1e+102
sprintf07: 45.6
sprintf08: 1E+102

sprintf09: 45.600

sprintf10: %45
sprintf11: D
sprintf12: Hello!
sprintf13: 8060208
sprintf14: 8065d04
[g@630m pl]$

 指数形式では、仮数部と指数部に分かれた形式になります。コンパクト形式では省略可能な0が省略されます。浮動小数点数で小数点以下の桁数を指定する場合は、%.nfという形式で指定をします。

 単独の文字を出力する場合は、%cを使います。この場合文字コードを指定します。文字列を入れる場合は%sを指定し、引数に文字列を指定します。これは、文字列変数や数値変数を組み合わせてフォーマットした文字列を作成する場合などに使うと便利です。

 そのほか、パーセント記号を出したいときは%%、アドレスの値を出したいときは%pを使います。