Help us understand the problem. What is going on with this article?

perl5のprintf/sprintfで`*`を使った書き方を学ぶ

More than 3 years have passed since last update.

この記事は、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';
sago35
現職は、車載組込エンジニア。 仕事では主にC言語、ツール類はperlおよびgolangで作成。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away