Frage

Ich bin auf der Suche nach einem eleganten Weg undefinierte Werte in Situationen zu bezeichnen, wo formatierte Zahlen in der Regel machen. Ich werde ein kleines Beispiel aufzuarbeiten. Für den Anfang können Sie natürlich nicht verwenden:

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

... weil die ‚verwenden Warnungen‘ Nägel Sie mit ‚Die Verwendung von nicht initialisierten Wert ...‘ auf der dritten Iteration. Der nächste Schritt ist so etwas wie folgt aus:

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

Und, Junge, tut ich den neuen 5.10 ‚//‘ Operator, nebenbei bemerkt. Aber das ist wirklich nicht das, was ich will, entweder, weil der Wert von $ s nicht Null ist, es ist nicht definiert. Was ich wirklich will, ist so etwas wie folgt aus:

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

... aber ich kann nicht, weil dies erzeugt das „Argument‚‘nicht numerisch ist ...“ Problem auf dem dritten Wert.

Das bringt mich zu der Tür meiner Frage. Ich kann natürlich Code schreiben, die jede Zahl, die ich aussenden für definierte Heit überprüft, und das schafft eine ganz andere nicht-% f-basierte Printf, aber, na ja, ... igitt.

Hat jemand eine nette Art und Weise definiert mit dieser Art von Anforderung umgehen?

War es hilfreich?

Lösung

Ich glaube nicht, dass es etwas igitt darüber - es ist genau das, was Sie tun mögen,

.
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);

Andere Tipps

Es ist nicht schön, aber ich würde es einfach tun, wie

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

Ich denke, das schön Art und Weise ist eine generische Pretty zu schreiben / bekommen, das, was Sie an ihn werfen nimmt und dann tun:

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top