Почему у меня "пропущен аргумент в printf at ..." в perl? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть perl код, где я печатаю в файл. Я даю формат

my $format = "%4d %2d %2d %2d %2d %2d" . " %7.2f" x 9 . "\n";

, потому что я пишу год месяц день час минута секунда и 9 значений с плавающей запятой. Затем я записываю в свой выходной файл как

printf $format, @data;        # print data on the screen
printf OUT $format, @data;    # print data into the file

Оба вышеприведенных оператора печатаются, но всегда с предупреждением «Отсутствует аргумент в printf в (номер строки)». Как правильно написать бланк и / или принт? Пожалуйста, помогите.

1 Ответ

2 голосов
/ 02 мая 2020

Это означает, что для строки формата требуется больше значений, чем содержится в @data.

$ perl -we'my @data = qw( a b c ); printf "%s %s %s\n", @data;'
a b c

$ perl -we'my @data = qw( a b   ); printf "%s %s %s\n", @data;'
Missing argument in printf at -e line 1.
a b

В вашем случае строка формата имеет 15 заполнителей, но @data содержит менее 15 элементов.


На основании ваших комментариев, я думаю, вы хотите

printf $format, $Y, $m, $d, $H, $M, $S, @data;

Это также можно записать следующим образом:

my $ts = sprintf("%04-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S);
my $format = "%s".( " %7.2f" x 9 )."\n";
printf $format, $ts, @data;

В большинстве случаев вы ' я начну с метки времени эпохи (возвращаемой time()). В этой ситуации можно использовать следующее:

use POSIX qw( strftime );

my $ts = strftime("%Y-%m-%d %H:%M:%S", localtime(time()));
my $format = "%s".( " %7.2f" x 9 )."\n";
printf $format, $ts, @data;

(обратите внимание, что местное время без смещения часового пояса создает неоднозначные временные метки во время «возврата» к стандартному времени в областях с летним временем).

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