sprintfをテンプレート生成器にしてみる(sprintf)


sprintfをテンプレート生成器にしてみる(sprintf)


sprintfがテンプレートエンジンのベースになっている気がしたので、

my $v = "%s,%s\n%s,%s\n";                 # テンプレート(文字列)
my @a = ( "(a)", "(b)", undef, "(d)" );   # 値のリスト
my $s = sprintf($v, @a);                  # 生成
printf "[$s]\n";

結果

[(a),(b)
,(d)
]

でも、少し長文の文字列から右詰め数文字分をあてたいとかする場合、フォーマットの文字数を超えて飛び出るし、左詰めになってしまうし、と思うような表示が実現できない場合があるようで、例えばこんなの。

my $i = 14;
printf " : [%4b]", (~$i);  # (NOT) '1111111111111111111111111111111111111111111111111111111111111010'

他のサイトでも事前加工してから本処理に渡しているようなアプローチをする方が多く、自分の未熟さもありますが、

my $i = 14;
printf " : [%s]",   substr(sprintf("%b", (~$i)), -4, 4);  # (NOT) '1010'

みたいに、あてる前にsubstr()とかでトリミングするなどの加工が必要かなって思ったりします。

やはりテンプレを使うならモジュールを使えってことなんですかね。

Task Runner