Pregunta

Estoy buscando una manera elegante para denotar valores no definidos en situaciones en las que por lo general hacen números con formato. Voy a trabajar hasta un pequeño ejemplo. Para empezar, por supuesto, no puede utilizar este:

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

... porque el 'usar las advertencias de las uñas con ustedes 'Uso del valor no inicializado ...' en la tercera iteración. Así que el siguiente paso es algo como esto:

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

Y, chico, qué me gusta el nuevo operador de 5.10 '//', por cierto. Pero eso no es realmente lo que quiero, o bien, porque no es el valor de $ s cero, es indefinido. Lo que realmente quiero es algo como esto:

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

... pero no puedo porque esto genera el "argumento '' no es numérico ..." Problemas en el tercer valor.

Esto me lleva a la puerta de mi pregunta. No puedo yo de escribir código supuesto que comprueba cada número emito para-dad definida, y que crea una cadena a base de f no% totalmente diferente formato de printf, pero, bueno, ... puaj.

¿Alguien ha definido una buena manera de hacer frente a este tipo de requisito?

¿Fue útil?

Solución

No creo que haya nada puaj en ello - es exactamente lo que quiere hacer

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

Otros consejos

No es bonito, pero yo sólo lo haría como

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

Creo que el agradable manera es escribir / conseguir un prettyprinter genérico que lleva todo lo que lanzar en él y luego hacer:

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top