Question

Je suis à la recherche d'un moyen élégant pour désigner des valeurs non définies dans des situations où des nombres formatés rendent habituellement. Je vais travailler un petit exemple. Pour commencer, bien sûr vous ne pouvez pas utiliser ceci:

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

... parce que les clous 'utiliser les 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 nouveau 5,10 opérateur « // », par le chemin. Mais c'est vraiment pas ce que je veux, que ce soit, parce que la valeur de $ s est non nul, elle est indéfinie. 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 me amène à la porte de ma question. Je peux d'écrire du code de cours qui vérifie chaque numéro I émets pour-ness défini, et qui crée un tout autre chaîne de format printf base f non%, mais, bien, ... beurk.

Quelqu'un at-il défini un bon moyen de faire face à ce type d'exigence?

Était-ce utile?

La solution

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

Autres conseils

Il est pas joli, mais je voudrais juste faire comme

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

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

#!/usr/bin/perl
use strict;
use warnings;
use MyPrettyPrinter;
for my $s (1, 1.2, undef, 1.3) {
    print MyPrettyPrinted($s), "\n";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top