Perl 避免";printf";从在空值上打印零开始
我想知道在用Perl打印未定义的值或空字符串时,如何避免从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中是否存在避免打印零的方法?您需要根据其内容将值转换为字符串 这段代码显示
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