【问题标题】:Why am I having "Missing argument in printf at ..." in perl?为什么我在 perl 中有“printf at ... 中缺少参数”?
【发布时间】:2020-05-02 20:13:25
【问题描述】:

我有要打印到文件的 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

上述两个语句都会打印,但总是带有“Missing argument in printf at (line number)”的警告。 编写格式和/或 printf 的正确方法是什么。请帮忙。

【问题讨论】:

  • @data 中有多少个元素?
  • 有9个元素
  • 您提供的格式字符串导致printf 预期为15。您的意思是x 3 而不是x 9
  • 我在想我必须为日期输入六种格式,为 9 个数据值输入 9 个格式,每个数据值保留 2 个小数位。那我怎么把它写6个日期值和9个数据值呢?
  • printf $format, $Y, $m, $d, $H, $M, $S, @data;?

标签: perl


【解决方案1】:

这表示格式字符串需要的值多于 @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 个。


根据你的cmets,我想你想要

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;

(请注意,没有时区偏移的当地时间在“回退”到夏令时地区的标准时间期间会产生不明确的时间戳。)

【讨论】:

  • 帮助我理解,日期附加到数据中,即它是从包含数据的文件中读取的。然后将数据从数据中拆分出来,但它们是一起写入的。所以我的理解是我可以写 printf "($Y, $m, $d, $H, $M, $S).( " %7.2f" x 9 , @data)"\n";
  • 你可以这样做,但你不想这样做有两个原因。 1)格式字符串是代码的一种形式,将数据注入代码是危险的。它在这里有效,但如果数据包含%,它将失败。这称为代码注入错误/缺陷。这就是我使用%s 并将时间戳作为参数传递的原因。 2) 它不会像您想要的那样在小于 10 的月、日、小时、分钟和秒值中添加前导零或空格。
  • 我认为是失败了。这就是我输入的内容: my ($Y, $m, $d, $H, $M, $S, @data) = split ' ';我的 $ts = sprintf("%04-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S);我的 $format = "%s".(" %7.2f" x 9 )."\n"; printf $格式,$ts,@data;我回到“printf at ...中缺少参数”
  • 打印 0+@data, "\n";使用 Missing 参数打印日期和 7 个值
  • 池上,其实是命令块 my($Y, $m, $d, $H, $M, $S, @data) = split ' ';我的 $ts = sprintf("%04-%02d-%02d %02d:%02d:%02d", $Y, $m, $d, $H, $M, $S);我的 $format = "%s".(" %7.2f" x 9 )."\n"; printf $格式,$ts,@data;作品。 Invalid argument 的问题来自于我在 %04 中遗漏了 d。非常感谢您解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多