我正在寻找一种优雅的方式来表示格式化数字通常呈现的情况下的未定义值.我会举一个小例子.对于初学者,你当然不能使用这个:
#!/usr/bin/perl use strict; use warnings; for my $s (1,1.2,undef,1.3) { printf "%5.2f\n",$s; }
…因为“使用警告”会在第三次迭代中指出“使用未初始化的值…”.所以下一步是这样的:
#!/usr/bin/perl use strict; use warnings; for my $s (1,$s//0; }
而且,男孩,顺便说一下,我喜欢新的5.10’//’运算符吗?但这也不是我想要的,因为$s的值不是零,它是未定义的.我真正想要的是这样的:
#!/usr/bin/perl use strict; use warnings; for my $s (1,$s//q(); }
…但我不能因为这会在第三个值上生成“参数”“不是数字……”问题.
这让我走到了我的问题的门口.我当然可以编写代码来检查我为定义的内容发出的每个数字,并创建一个完全不同的非基于%f的printf格式字符串,但是,好吧,…哎呀.
有没有人定义了一种很好的方法来处理这种类型的要求?
解决方法
我不认为有任何关于它的东西 – 这正是你想要做的.
use strict; use warnings; my($raw) = [1,1.3]; my($formatted) = [map((defined $_ ? sprintf('%5.2f',$_) : "(undef)"),@$raw)]; print '$formatted: <',join('> <',@{$formatted}),qq(>\n);