避免“printf”在空值上打印零

时间:2016-08-08 18:27:20

标签: perl printf

我想知道如何在使用Perl打印未定义的值或空字符串时避免从printf获取零:

$ perl -le 'printf "%.4f", undef'
0.0000

这个小C程序告诉我这就是printf的工作方式。

#include <stdio.h>
main()
{
    printf ("%.4f\n", "");
}

printf内是否存在以避免打印零?

2 个答案:

答案 0 :(得分:3)

您需要根据其内容将值转换为字符串

此代码显示了这个想法,但它可能过于复杂,可以根据变量的预期内容进行缩减

use strict;
use warnings 'all';

for my $val ( undef, "", 'XX', 0, 0.3 ) {
    my $sval = defined $val &&  length $val ? sprintf '%.4f', $val : '';
    printf "Value is %s\n", $sval;
}

输出

Value is 
Value is 
Argument "XX" isn't numeric in sprintf at E:\Perl\source\012.pl line 7.
Value is 0.0000
Value is 0.0000
Value is 0.3000


另一种方法是使用核心looks_like_number模块中的Scalar::Util

此代码还通过将未定义的值转换为字符串undef来处理它们。同样,对此进行编码的最佳方式取决于您的要求

use strict;
use warnings 'all';

use Scalar::Util 'looks_like_number';

for my $val ( undef, "", 'XX', 0, 0.3 ) {
    my $sval = $val // 'undef';
    $sval = sprintf '%.4f', $sval if looks_like_number($sval);
    printf "Value is %s\n", $sval;
}

输出

Value is undef
Value is 
Value is XX
Value is 0.0000
Value is 0.3000

答案 1 :(得分:3)

C程序什么也没告诉你。它具有未定义的行为,因为""不是格式字符串的正确类型。

您正在获得浮点输出,因为这是您使用"%.4f"所要求的。

在Perl中,如果使用printf "%.4f", ...打印某些内容,它会将参数视为实数并相应地对其进行格式化。在此上下文中,特殊值undef显然被视为0.0。如果要为undef参数打印空字符串(或等效地,不打印任何内容),则需要使用不同的格式字符串 - 或者根本不调用printf

if (defined $foo) {
    printf "%.4f", $foo;
}

请注意,这只会检查是否定义了$foo,而不是它是否为数字。例如,如果$foo的值是引用,那么您将获得某个内存地址的无意义数字表示。