- ベストアンサー
printfやsprintfで、0に符号 (+) をつけない方法
Perlの問題ではないのかなとも思うのですが、 my @num1 = (1, 0, 2, 0); my @num2 = (0, -3, 0, 2); foreach my $num1 (@num1) { my $num2 = shift @num2; printf "%+d%+d\n", $num1, $num2; } などと%+dとすると、0の場合に+0となってしまいます。これを単純に0とするシンプルなやり方はないでしょうか?この場合は foreach my $num1 (@num1) { my $num2 = shift @num2; if ($num1) { printf "%+d%+d\n", $num1, $num2 } else { printf "0%+d\n", $num2 } } とすることで満足する結果となりますが、複数の数値部分で+0となるのを回避したい場合など、このようなif文でやると変に複雑なスクリプトになると思うのですが、そうするしかないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
my $format = ($num1>0 ? "%+d":"%d").($num2>0 ? "%+d":"%d")."\n"; printf $format, $num1, $num2; とするとか あるいは、sprintfして、s/\+0/0/g するとか
その他の回答 (1)
- tyunji
- ベストアンサー率19% (68/349)
回答No.1
表示部分だけサブルーチンにしてしまえば、見た目は複雑にならないと思います。
質問者
お礼
確かに複雑にならなかったとしても、表示部分を明確にした方が、後で読みやすくていいと思いました。 引数が+0だったら0を返すような関数を自作して使うのもいいかもしれないですね。 ありがとうございます。
お礼
三項演算子をこんな風に使うといいんですね。0とそれ以外というイメージでばかり考えていて、0の場合と負数の場合に%dにするというのは、なるほどと思いました。 上の例では$num2の方は常に%+dでいいので、正確には my $format = ($num1>0 ? "%+d" : "%d") . "%+d\n"; あるいは my $format = ($num1 ? "%+d" : "%d") . "%+d\n"; でしょうか。sprintして、その中の+0のところを置換するというのも、この部分が加わるだけでシンプルでいいですね。 上の例では s/^\+0/0/ な感じかな。勉強になりました。ありがとうございます。