2009-02-13 6 views
4

Je cherche une manière élégante de dénoter des valeurs non définies dans des situations où les nombres formatés rendent habituellement. Je vais travailler un petit exemple. Pour commencer, bien sûr vous ne pouvez pas utiliser ceci:Comment rendre des valeurs indéfinies à partir de printf en Perl?

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

... parce que les ongles »donnent des avertissements de vous avec « Utilisation de la valeur non initialisée ... » sur la troisième itération. L'étape suivante est quelque chose comme ceci:

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

Et, mon garçon, que j'aime le nouvel opérateur 5,10 « // », par le chemin. Mais ce n'est vraiment pas ce que je veux non plus, parce que la valeur de $ s n'est pas nulle, c'est indéfini. Ce que je veux vraiment quelque chose comme ceci:

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

... mais je ne peux pas parce que cela génère le problème « Argument « » est pas numérique ... » sur la troisième valeur.

Cela m'amène à la porte de ma question. Je peux bien sûr écrire du code qui vérifie chaque nombre que j'émets pour défini-ness, et cela crée une chaîne de format printf différente de% f non basée sur f, mais, bien, ... beurk. Est-ce que quelqu'un a défini une bonne façon de faire face à ce type d'exigence?

Répondre

3

Je ne pense pas qu'il y ait quoi que ce soit beurk à ce sujet - c'est exactement ce que vous voulez faire.

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

Il est pas joli, mais je venais de le faire comme

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

Je pense que la belle façon est d'écrire/obtenir un prettyprinter générique qui prend tout ce que vous lui lancez, puis faire:

#!/usr/bin/perl 
use strict; 
use warnings; 
use MyPrettyPrinter; 
for my $s (1, 1.2, undef, 1.3) { 
    print MyPrettyPrinted($s), "\n"; 
} 
Questions connexes