この記事は、Perl 5 Advent Calendar 2016 - Qiitaの4日目の記事です。
昨日は、私sago35が、Getopt::Kingpinを使って、さくっとコマンドラインスクリプトを作成するを書きました。
今日は、printf/sprintfのフォーマット部分について書いてみます。
sprintfとかprintf使ってますか?
低レベルではありつつも、テキストを思い通りに出力するのに欠かせない関数だと思っています。
で、golangでは以下のような構文が使えます。
fmt.Sprintf("%[3]*.[2]*[1]f", 12.0, 2, 6)
これは、以下と同じ意味になります。
fmt.Sprintf("%6.2f", 12.0)
すなわち、[3]
とかで3番目の引数から何かをする、とかそういうのが可能になるわけです。
fmt.Sprintf("%[1]s = %[1]s + 1\n", "x")
こんな感じに書くと、x = x + 1
と出力されるわけです。
で、perlでもやりたいと思ったわけです。
結論
perlでも元からできます。
# y = y + x
printf '%2$s = %2$s + %1$s', "x", "y";
%2$s
は、2個目の引数(y
)を文字列として評価(%s
として評価)する、という意味になります。
何度も同じ表記%2$s
が使えるので、y
を何度も書く必要はなくなります。
%1$s
は、1個目の引数(x
)を文字列として評価する意味になります。
ダブルクォート内に書くときはエスケープが必要です。
微妙に書きにくい・・・。
printf "%2\$s = %2\$s + %1\$s", "x", "y";
詳細は、perldoc -f sprintf
から確認できます。
おまけ
widthの指定も同じように指定の場所から選ぶことができます。
# [ x]
printf '[%2$*1$s]', 3, 'x';