Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

この記事は、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';
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
4
Help us understand the problem. What are the problem?