文字列の整形
文字列を整形するには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を使います。