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

时间:2010-09-15 07:08:53

标签: perl

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

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

打印

Number: %lG

不是

Number: 0.1

用户报告他们的Perl是5.8版。我最老的版本是5.8.1,它似乎行为正确。

任何猜测?配置错误?模块冲突?

3 个答案:

答案 0 :(得分:7)

引用sprintf文档:

  

返回由C库的常规printf约定格式化的字符串   函数sprintf。有关详细信息,请参阅下文,并参阅sprintf(3)或   printf(3)在您的系统上,用于解释一般原则。

IOW,就像许多内置插件一样,Perl只是简单地包装了一个函数,而且它就是这样 平台依赖。

  

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

%l不属于它。我的猜测是远程用户没有使用GNU。通过键入man 3 sprintfman 3 printf,他可以准确找到未经洗涤的Unix所支持的内容。

答案 1 :(得分:4)

只有在不识别格式说明符时才应该这样做。例如:

pax> perl -e 'printf "Number: %q\n", 0.1'
Number: %q

我认为你将不得不去现场解决这个问题,尽管你可能想让他们剪切并粘贴文本和屏幕转储,例如,HyperSnap demo,进入电子邮件,以便您仔细检查。我只建议一个,因为我们在内部使用它,它有免费试用。您可以使用任何您喜欢的屏幕捕获程序。

我原本以为他们可能会输入1G(wun jee)而不是lG(ell jee),但前者仍有效。

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

顺便说一句,我只有5.10才能使用,所以可能是一个版本问题。然而,很难想象5.8和5.8.1之间存在重大差异。

答案 2 :(得分:2)

<德尔> 看起来它是一个Perl构建配置问题。 Perl构建支持`d_longdbl`选项,它指示是否允许长双精度。您可以使用以下命令测试它是否在您的机器上设置:
perl -V:d_longdbl

perldoc sprintf的更多信息。 感谢大家的投入。


编辑:

不,那也不是。仔细检查sprintf文档后发现,long double的修饰符为qllL NOT ll是整数类型的有效修饰符。 D'哦。

看起来大多数perl安装都会默默地忽略l,并正确解析修改器的其余部分。除了我们用户的网站。 ☹无论如何,通过对长双精度使用有效修饰符来解决问题。

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

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

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

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

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