6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perl 5Advent Calendar 2016

Day 4

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

Posted at

この記事は、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';
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?