¿Cómo puedo hacer que los valores no definidos de printf en Perl?
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?
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";
}