我正在尝试调试远程用户网站上的问题。我们已经将它缩小到Perl中格式化输出的问题。用户向上和向下发誓
perl -e 'printf "Number: %lG\n", 0.1'
打印
Number: %lG
不是
Number: 0.1
用户报告他们的Perl是5.8版。我最老的版本是5.8.1,它似乎行为正确。
任何猜测?配置错误?模块冲突?
答案 0 :(得分:7)
引用sprintf
文档:
返回由C库的常规
printf
约定格式化的字符串 函数sprintf
。有关详细信息,请参阅下文,并参阅sprintf(3)
或printf(3)
在您的系统上,用于解释一般原则。
IOW,就像许多内置插件一样,Perl只是简单地包装了一个函数,而且它就是这样 平台依赖。
Perl的
sprintf
允许以下众所周知的转换:
%l
不属于它。我的猜测是远程用户没有使用GNU。通过键入man 3 sprintf
或man 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)会打印出文本而不是数字,但除非他们使用特别糟糕的字体,否则这应该是一个可识别的差异。
答案 2 :(得分:2)
perl -V:d_longdbl
perldoc sprintf的更多信息。 感谢大家的投入。
编辑:
不,那也不是。仔细检查sprintf文档后发现,long double的修饰符为q
,ll
和L
, NOT l
。 l
是整数类型的有效修饰符。 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安装都会忽略它。