C言語の
sprintf と同じ書式で、
printf と同じようにフォーマットされた文字列を返します。あなたのシステムの
sprintf(3) と
printf(3) のマニュアルも参照してください。
例:
# 先頭に0を付加して、8桁揃えにした数字
$result = sprintf("%08d", $number);
# 小数点以下3桁の表示
$rounded = sprintf("%.3f", $number);
Perlは
sprintf のフォーマットを独自に行い、C言語の
sprintf を使用しません。そのため、ローカルの
sprintf が拡張されていたとしても、Perlの
sprintf に影響を与えません。
printf と異なり、
sprintf は引数として渡す配列の最初の要素をフォーマットとして渡そうとした場合、恐らくあなたの意図する動作をしません。配列はスカラコンテキストとして与えられ、配列の要素数をフォーマットとして渡すため、それは意味のある動作にはならないでしょう。
Perlの
sprintf は次の一般的なフォーマットをサポートします。
%% パーセント記号
%c 文字
%s 文字列
%d 10進数
%u 符号無し10進数
%o 符号無し8進数
%x 符号無し16進数
%e 浮動小数点(指数形式)
%f 浮動小数点(固定小数点形式)
%g 浮動小数点(%e もしくは %f の形式)
また、次のフォーマットも追加でサポートします。
%X %x と同じですが、大文字を使用します
%E %e と同じですが、大文字の"E"を使用します
%G %g と同じですが、大文字の"E"を使用します
%b an unsigned integer, in binary
%p ポインタ(値が置かれているアドレスを16進数で)
%n 特殊:パラメータリストの次の変数に、出力した文字数を入れる
その他に、後方互換性として、次のフォーマットもサポートします。
%i %d と同じです
%D %ld と同じです
%U %lu と同じです
%O %lo と同じです
%F %f と同じです
"%"と変換コード("c"や"s"などの文字)の間に以下のような値を記述することで、より細かい制御が行えます。
【フォーマットパラメータインデックス】
フォーマットを適用するリスト要素のインデックスを明示的に指定できます("2$"の様に指定します)。デフォルトでは、次のまだフォーマットしていないリスト要素を使用します。
printf '%2$d %1$d', 12, 34; # prints "34 12"
printf '%3$d %d %1$d', 1, 2, 3; # prints "3 1 1"
【フラグ】
数字の前に付加する文字を指定します。
printf '<% d>', 12; # 出力 "< 12>"
printf '<%+d>', 12; # 出力 "<+12>"
printf '<%6s>', 12; # 出力 "< 12>" 数字で桁を指定
printf '<%-6s>', 12; # 出力 "<12 >" マイナスを付けると右揃え
printf '<%06s>', 12; # 出力 "<000012>" ゼロを付けると0で桁揃え
printf '<%#x>', 12; # 出力 "<0xc>" 16進数"0x"、8進数"0"を付加
【ベクターフラグ】
分割された数値のベクタを文字列として結合します。
printf "version is v%vd\n", $^V; # Perl's version
"*"を"v"の前に置くと、分割に使用されている文字列を上書きします。
printf "address is %*vX\n", ":", $addr; # IPv6アドレス
printf "bits are %0*v8b\n", " ", $bits; # ランダムビットストリング
また、インデックスを指定することで("*2$v"のように)、結合に使用する文字を指定することもできます。
printf '%*4$vX %*4$vX %*4$vX', @addr[1..3], ":"; # IPv6アドレスを":"で区切る
【最低桁数】
出力する桁数(幅数)を指定します。マイナスが指定された場合は、左揃えになります。
printf '<%s>', "a"; # 出力 "<a>"
printf '<%6s>', "a"; # 出力 "< a>"
printf '<%*s>', 6, "a"; # 出力 "< a>"
printf '<%*2$s>', "a", 6; # 出力 "< a>"
printf '<%2s>', "long"; # 出力 "<long>" (変換されない)
【最大桁数】
ドットを付けて数字を指定することで最大桁数を指定できます。(".*2$x"の様な)インデックスによる指定は現在機能しません(将来、実装予定です)。
printf '<%f>', 1; # 出力 "<1.000000>"
printf '<%.1f>', 1; # 出力 "<1.0>"
printf '<%.0f>', 1; # 出力 "<1>"
printf '<%e>', 10; # 出力 "<1.000000e+01>"
printf '<%.1e>', 10; # 出力 "<1.0e+01>"
printf '<%.6x>', 1; # 出力 "<000001>"
printf '<%#.6x>', 1; # 出力 "<0x000001>"
printf '<%-10.6x>', 1; # 出力 "<000001 >"
printf '<%.5s>', "truncated"; # 出力 "<trunc>"
printf '<%10.5s>', "truncated"; # 出力 "< trunc>"
printf '<%.6x>', 1; # 出力 "<000001>"
printf '<%.*x>', 6, 1; # 出力 "<000001>"