我想知道如何在使用Perl打印未定义的值或空字符串时避免从printf
获取零:
$ perl -le 'printf "%.4f", undef'
0.0000
这个小C程序告诉我这就是printf
的工作方式。
#include <stdio.h>
main()
{
printf ("%.4f\n", "");
}
在printf
内是否存在以避免打印零?
答案 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
的值是引用,那么您将获得某个内存地址的无意义数字表示。