Perl 避免";printf";从在空值上打印零开始

Perl 避免";printf";从在空值上打印零开始,perl,printf,Perl,Printf,我想知道在用Perl打印未定义的值或空字符串时,如何避免从printf中获取零: $ perl -le 'printf "%.4f", undef' 0.0000 这个小C程序告诉我这就是printf的工作方式 #include <stdio.h> main() { printf ("%.4f\n", ""); } #包括 main() { printf(“%.4f\n”,”); } printf中是否存在避免打印零的方法?您需要根据其内容将值转换为字符串 这段代码显示

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

$ perl -le 'printf "%.4f", undef'
0.0000
这个小C程序告诉我这就是
printf
的工作方式

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

printf
中是否存在避免打印零的方法?

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

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

使用严格;
使用“全部”警告;
对于我的$val(未定义,“,'XX',0,0.3){
my$sval=defined$val&&length$val?sprintf'.4f',$val:'';
printf“值为%s\n”,$sval;
}
输出
值为
价值是
参数“XX”在sprintf的E:\Perl\source\012.pl第7行中不是数字。
值为0.0000
值为0.0000
该值为0.3000


另一种方法是使用核心
Scalar::Util
模块中的
looks\u like\u number

此代码还通过将未定义的值转换为字符串
undef
来处理这些值。同样,编写此代码的最佳方法将取决于您的需求

使用严格;
使用“全部”警告;
使用Scalar::Util“看起来像数字”;
对于我的$val(未定义,“,'XX',0,0.3){
my$sval=$val/'未定义';
$sval=sprintf'.4f',$sval如果看起来像数字($sval);
printf“值为%s\n”,$sval;
}
输出
值未定义
价值是
值为XX
值为0.0000
该值为0.3000

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

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

使用严格;
使用“全部”警告;
对于我的$val(未定义,“,'XX',0,0.3){
my$sval=defined$val&&length$val?sprintf'.4f',$val:'';
printf“值为%s\n”,$sval;
}
输出
值为
价值是
参数“XX”在sprintf的E:\Perl\source\012.pl第7行中不是数字。
值为0.0000
值为0.0000
该值为0.3000


另一种方法是使用核心
Scalar::Util
模块中的
looks\u like\u number

此代码还通过将未定义的值转换为字符串
undef
来处理这些值。同样,编写此代码的最佳方法将取决于您的需求

使用严格;
使用“全部”警告;
使用Scalar::Util“看起来像数字”;
对于我的$val(未定义,“,'XX',0,0.3){
my$sval=$val/'未定义';
$sval=sprintf'.4f',$sval如果看起来像数字($sval);
printf“值为%s\n”,$sval;
}
输出
值未定义
价值是
值为XX
值为0.0000
该值为0.3000

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

您得到的是浮点输出,因为这正是您使用
“%.4f”
所要求的

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

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

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

C程序不会告诉您任何信息。它具有未定义的行为,因为
的格式字符串类型不正确

您得到的是浮点输出,因为这正是您使用
“%.4f”
所要求的

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

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

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

C的
printf
与同名的Perl函数无关。您使用了浮点字段说明符,因此传递的任何值都将作为一个数字进行计算。如果您启用了应该启用的警告,那么您将收到一条消息,告诉您this@Mat:C程序没有未定义的行为,因为
不是
浮点值。它有未定义的行为,因为
既不是
双精度的
(这是
%f
所要求的)也不是
浮动的
(将被提升为
双精度的
)。@Mat:有什么区别<代码>浮动
是一种特定类型。三种类型
float
double
long double
统称为浮点类型,而不是“float”。C的
printf
与同名Perl函数无关。您使用了浮点字段说明符,因此传递的任何值都将作为一个数字进行计算。如果您启用了应该启用的警告,那么您将收到一条消息,告诉您this@Mat:C程序没有未定义的行为,因为
不是
浮点值。它具有未定义的行为,因为
既不是
双精度
(这是
%f
所要求的)也不是
f