Как я могу отобразить неопределенные значения из printf в Perl? - PullRequest
4 голосов
/ 13 февраля 2009

Я ищу элегантный способ обозначения неопределенных значений в ситуациях, когда обычно отформатированные числа отображаются. Я приведу небольшой пример. Для начала вы, конечно, не можете использовать это:

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

... потому что «использование предупреждений» прибивает вас к «Использованию неинициализированного значения ...» на третьей итерации. Итак, следующий шаг примерно такой:

#!/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();
}

... но я не могу, потому что это порождает проблему "Аргумент" "не числовой ..." для третьего значения.

Это подводит меня к порогу моего вопроса. Я, конечно, могу написать код, который проверяет каждое число, которое я испускаю на определенность, и который создает совершенно другую строку формата printf, не основанную на% f, но, ну, в общем ... yuck.

Кто-нибудь определил хороший способ справиться с этим типом требования?

Ответы [ 3 ]

3 голосов
/ 13 февраля 2009

Я не думаю, что есть что-то гадость - это именно то, что вы хотите сделать.

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);
3 голосов
/ 13 февраля 2009

Я думаю, что хороший способ состоит в том, чтобы написать / получить универсальный prettyprinter, который берет все, что вы кидаете в него, а затем делаете:

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
3 голосов
/ 13 февраля 2009

Это не красиво, но я бы просто сделал это как

defined($s) ? printf "%f.2f\n", $s : print "undef\n";
...