どのように私はPerlでのprintfから未定義の値をレンダリングすることができますか?

StackOverflow https://stackoverflow.com/questions/547042

  •  23-08-2019
  •  | 
  •  

質問

私は、フォーマットされた数字は通常のレンダリング状況で未定義の値を示すためにエレガントな方法を探しています。私は小さな例をうまくいきます。手始めに、もちろんあなたはこれを使用することはできません。

#!/usr/bin/perl
use strict;
use warnings;
for my $s (1, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s;
}

...「使用の警告」爪なぜならあなた3回目の繰り返しで「初期化されていない値の使用...」と。だから、次のステップは、このようなものです。

#!/usr/bin/perl
use strict;
use warnings;
for my $s (1, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s//0;
}

そして、少年、私は道によって、新しい5.10「//」演算子が好きです。しかし、それは、それは未定義だ、$ sの値がゼロではないので、私は、どちらか、欲しいものは本当にありません。私が本当に欲しいのはこのようなものです。

#!/usr/bin/perl
use strict;
use warnings;
for my $s (1, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s//q();
}

...しかし、私は、これは「引数 『は』数字ではありません発生することができないので...」問題の3番目の値でます。

これは私の質問の玄関口に私をもたらします。私は、定義されたらしため発する毎に番号をチェックコースライトコードすることができ、それは全体の異なる非%のF系のprintf形式の文字列を作成し、しかし、よく、...不潔。

誰もが要件のこのタイプに対処するための良い方法を定義していますか?

役に立ちましたか?

解決

私はそれについて何がの不潔のないと思う - それはあなたがやりたいことを正確に何を

use strict;
use warnings;

my($raw) = [1, 1.2, undef, 1.3];
my($formatted) = [map((defined $_ ? sprintf('%5.2f', $_) : "(undef)"), @$raw)];

print '$formatted: <', join('> <', @{$formatted}), qq(>\n);

他のヒント

これはかなりではないのですが、私は

としてそれを行うだけだろう
defined($s) ? printf "%f.2f\n", $s : print "undef\n";

私は<私>の素敵なの方法は、あなたがそれで投げると、次に行うものは何でも取る汎用もしPrettyPrinterを取得/書くことだと思います

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top