Почему Perf printf выводит спецификатор формата, а не форматированное число? - PullRequest
3 голосов
/ 15 сентября 2010

Я пытаюсь отладить проблему на сайте удаленного пользователя. Мы сузили это до проблемы с форматированным выводом в Perl. Пользователь ругается вверх и вниз, что

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

печать

Number: %lG

не

Number: 0.1

Пользователь сообщает, что его Perl версии 5.8. Самая старая версия, которую я имею, это 5.8.1, и она, кажется, ведет себя правильно.

Есть предположения? Неправильная конфигурация? Модуль конфликтует?

Ответы [ 3 ]

7 голосов
/ 15 сентября 2010

Цитирование из sprintf документации:

Возвращает строку, отформатированную обычными printf соглашениями библиотеки C функция sprintf. См. Ниже для получения более подробной информации и см sprintf(3) или printf(3) в вашей системе для объяснения общих принципов.

IOW, как и во многих встроенных модулях, Perl просто оборачивает функцию, и это зависит от платформы.

Perl sprintf допускает следующие общеизвестные преобразования:

%l не является его частью. Я предполагаю, что удаленный пользователь не использует GNU. Он может точно узнать, что поддерживается его немытым Unix, набрав man 3 sprintf или man 3 printf.

4 голосов
/ 15 сентября 2010

Это следует делать только в том случае, если он не распознает спецификатор формата.Например:

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

Я думаю, вам нужно будет зайти на сайт, чтобы понять это, хотя вы, возможно, захотите сначала заставить их вырезать и вставлять текст и снимок экрана из, дляНапример, HyperSnap demo, в электронное письмо, чтобы вы могли внимательно его проверить.Я предлагаю только один, так как мы используем его внутри, и у него есть бесплатная пробная версия.Вы можете использовать любую приличную программу захвата экрана, которая вам нравится.

Я изначально думал, что они могут набирать 1G (wun jee) вместо lG (ell jee), но первая все еще работает.

Я заметил, что IG (глазной джип) будет печатать текст, а не номер, но, если они не используют особо плохой шрифт, это должно быть ощутимой разницей.

Кстати, У меня есть только 5.10 для работы, так что может быть проблемой версии.Однако трудно представить, что между 5,8 и 5,8,1 будет существенная разница.

2 голосов
/ 16 сентября 2010
Похоже, что это проблема конфигурации Perl.Сборка Perl поддерживает параметр `d_longdbl`, который указывает, разрешены ли длинные двойные числа или нет.Вы можете проверить, установлен ли он на вашем компьютере, с помощью:
perl -V:d_longdbl

Больше информации на perldoc sprintf .Всем спасибо за ваш вклад.


Редактировать:

Нет, это тоже не было.При внимательном рассмотрении документации sprintf выяснилось, что модификаторы для длинных двойных символов q, ll и L, NOT l.l является допустимым модификатором для целочисленных типов.D'oh.

Похоже, что большинство установок 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 тоже игнорируют это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...