【问题标题】:How can I render undefined values from printf in Perl?如何在 Perl 中从 printf 呈现未定义的值?
【发布时间】:2010-10-07 12:25:22
【问题描述】:

我正在寻找一种优雅的方式来在通常呈现格式化数字的情况下表示未定义的值。我会举一个小例子。对于初学者,你当然不能使用这个:

#!/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, 1.2, undef, 1.3) {
    printf "%5.2f\n", $s//0;
}

顺便说一句,男孩,我喜欢新的 5.10 '//' 运算符吗?但这也不是我想要的,因为 $s 的值不是零,它是未定义的。我真正想要的是这样的:

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

...但我不能,因为这会在第三个值上产生“参数”不是数字...”问题。

这将我带到了我的问题的门口。我当然可以编写代码来检查我发出的每个数字的已定义性,并创建一个完全不同的非基于 %f 的 printf 格式字符串,但是,嗯,...哎呀。

有没有人定义了一个很好的方法来处理这种类型的需求?

【问题讨论】:

    标签: perl printf undef


    【解决方案1】:

    我不认为这有什么恶心——这正是你想要做的。

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

    【讨论】:

      【解决方案2】:

      它不漂亮,但我只是这样做

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

      【讨论】:

        【解决方案3】:

        我认为 nice 的方法是编写/获取一个通用的漂亮打印机,它可以接收你扔给它的任何东西,然后执行:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-24
          • 2013-12-22
          • 1970-01-01
          相关资源
          最近更新 更多