4

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

#!/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形式の文字列を作成するコードを書くことはできますが、まあ、...うん。

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

4

3 に答える 3

3

それはきれいではありませんが、私はそれを次のようにします

defined($s) ? printf "%f.2f\n", $s : print "undef\n";
于 2009-02-13T18:17:35.587 に答える
3

それについて悪いことは何もないと思います-それはまさにあなたがやりたいことです。

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);
于 2009-02-13T18:23:56.773 に答える
3

良い方法は、あなたが投げたものを何でも受け取って実行する汎用のプリティプリンターを作成/取得することだと思います:

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
于 2009-02-13T18:27:45.080 に答える