为什么Perl的printf会输出格式说明符而不是格式化的数字?

为什么Perl的printf会输出格式说明符而不是格式化的数字?,perl,Perl,我正在尝试调试远程用户站点上的问题。我们已经将其缩小到Perl中格式化输出的问题。用户上下发誓说 perl -e 'printf "Number: %lG\n", 0.1' 印刷品 Number: %lG 不是 用户报告他们的Perl版本是5.8。我拥有的最古老的版本是5.8.1,它似乎运行正常 猜猜看?配置错误?模块冲突?只有在无法识别格式说明符的情况下才应该这样做。例如: pax> perl -e 'printf "Number: %q\n", 0.1' Number: %q 我

我正在尝试调试远程用户站点上的问题。我们已经将其缩小到Perl中格式化输出的问题。用户上下发誓说

perl -e 'printf "Number: %lG\n", 0.1'
印刷品

Number: %lG
不是

用户报告他们的Perl版本是5.8。我拥有的最古老的版本是5.8.1,它似乎运行正常


猜猜看?配置错误?模块冲突?

只有在无法识别格式说明符的情况下才应该这样做。例如:

pax> perl -e 'printf "Number: %q\n", 0.1'
Number: %q
我认为你必须去网站上找出这个问题,尽管你可能想首先让他们把文本和屏幕转储文件(例如demo)剪切粘贴到电子邮件中,以便你仔细检查。我只建议一个,因为我们在内部使用它,它有一个免费试用。你可以使用任何你喜欢的像样的屏幕截图程序

我原本以为他们可能用1G wun-jee而不是lG ell-jee打字,但前者仍然有效

我注意到IG eye jee会打印文本而不是数字,但是,除非他们使用了特别糟糕的字体,否则这应该是一个可以识别的区别

顺便说一句,我只有5.10的工作,所以它可能是一个版本的问题。然而,很难想象5.8和5.8.1之间会有重大区别。

引用文档:

返回一个字符串,该字符串由C库的常用printf约定格式化 函数sprintf。有关更多详细信息,请参见下文,并参见sprintf3或 在系统上打印F3以了解一般原则的解释

正如许多内置函数一样,Perl只是简单地包装了一个函数,而且 平台相关

Perl的sprintf允许以下众所周知的转换:

%我不是它的一部分。我猜远程用户没有使用GNU。他可以通过键入man3sprintf或man3printf,准确地找出未经清洗的Unix支持什么

看起来这是一个Perl构建配置问题。Perl构建支持'd_longdbl'选项,该选项指示是否允许长双精度。您可以通过以下方式测试是否在您的机器上设置: 更多信息请访问。 谢谢大家的意见

编辑:

不,也不是这样。仔细检查sprintf文档发现长双精度的修饰符是q、ll和L,而不是L。l是整数类型的有效修改器。哦

看起来大多数perl安装都会默默地忽略l,并正确地解析其余的修饰符。除了在我们用户的网站上。☹ 无论如何,这个问题是通过使用一个有效的修饰符来修复的

仅供参考,我在C printf中使用了相同的格式说明符

第一个调用“已工作”,打印出0.001,但第二个调用打印出一个垃圾值,直到我正确指定了数值文本的类型:

printf("The number is %LG\n", 0.001L);

显然,C printf正在默默地忽略不正确的l修饰符。这使我怀疑大多数Perl安装也会忽略它。

这是有道理的。当所有非GNU系统消失时,我会很高兴:-+1。同样引用sprintf文档,应该仔细阅读daxim:Perl有自己的sprintf格式-它模拟C函数sprintf,但除了浮点数之外,它不使用它,即使这样,也只允许使用标准修饰符。因此,本地sprintf中的任何非标准扩展都无法从Perl获得。%lG受sprintf的支持:%G与%G类似,但如果适用,则使用大写字母E;在size下:“l将整数解释为C类型long或无符号long%lG是POSIX/Single Unix规范中的有效格式。仅仅因为GNU有时正确地从POSIX复制并不能使它变得更好。实际上它看起来好像%lG不是一个有效的说明符ld可以,或%llG,但不是%lG。有关详细信息,请参阅我的答案。Daxim的答案与实际问题非常接近。但不是GNU/Posix问题,只是说明符不正确。用户错误,请替换用户,然后重试。您应该在该格式说明符周围使用单引号,以便%lG不会意外插入名为%lG的哈希的内容中。您应该检查他们没有使用print而不是printf。Ether:$和@interpolate,而不是%。你需要像print@{[%lG]}这样的东西;为了实现这一点。From perlop:对于进行插值的构造,将插值以$或@开头的变量。下标变量如$a[3]或$href->{key}[0]也会被插值,数组和哈希切片也是如此。但是$obj->meth之类的方法调用是无效的。@MkV,谢谢您的输入。不幸的是,对我来说,这看起来真的不像是用户错误。已知在其他机器上正常工作的脚本在用户的机器上显示相同的问题。我给出的内联脚本只是最简单的复制案例。您知道perl构建中是否有配置选项可以关闭对长浮动的支持吗?@MkV,谢谢您的签入
g在5.6中。知道这一点很有帮助。你的答案最适合这个问题。去吧,接受它而不是我的,这样它就会被放在它所属的顶部。
perl -V:d_longdbl
printf("The number is %lG\n", 0.001);
printf("The number is %LG\n", 0.001);
printf("The number is %LG\n", 0.001L);