Почему printf и sprintf ведут себя по-разному, когда передается только массив? - PullRequest
10 голосов
/ 21 марта 2010
sub do_printf  { printf @_ }
sub do_sprintf { print sprintf @_ }

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok"); # prints 2

Ответы [ 5 ]

14 голосов
/ 21 марта 2010

sprintf имеет прототип $@, а printf имеет прототип @

13 голосов
/ 21 марта 2010

Из perldoc на sprintf :

В отличие от printf, sprintf не делает что вы, вероятно, имеете в виду, когда вы проходите это массив в качестве вашего первого аргумента. Массив задается скалярным контекстом, и вместо использования 0-го элемента массив в качестве формата, Perl будет использовать количество элементов в массиве как формат, который почти никогда полезно.

9 голосов
/ 21 марта 2010

См. Ответы codeholic и Mark для объяснения того, почему они ведут себя по-разному.

В качестве обходного пути просто выполните:

sub do_sprintf { print sprintf(shift, @_) }

Тогда

sub do_printf  { printf @_ }
sub do_sprintf { print sprintf(shift, @_) }

do_printf("%s\n", "ok");  # prints ok
do_sprintf("%s\n", "ok2"); # prints ok2
2 голосов
/ 21 марта 2010

Они делают разные вещи. Для printf вывод составляет от до потока; для sprintf вы хотите построить строку. Он обрабатывает форматирование ( f ) команды печати. Основная цель printf состоит в том, чтобы распечатать значение, которое он создает, в поток, но с помощью s (tring) printf (ormat) вы пытаетесь создать строку, а не печатать ее.

printf возвращает количество символов, напечатанных в потоке в качестве обратной связи. После того, как символы напечатаны в потоке, они вышли из логической структуры программы. Тем временем, sprintf должен вернуть вам строку. Наиболее удобный способ - это возвращаемое значение, которое можно проверить по длине, потому что оно находится в структуре программы, содержит ли оно какие-либо или все, что вы хотите.

Почему не должны вести себя по-разному?

1 голос
/ 21 марта 2010

sprintf оценивает массив в скалярном контексте. Ваш массив состоит из двух элементов, поэтому он оценивается как "2" (без завершающего \ n).

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