在Perl中使用'printf'格式化输出

时间:2012-10-23 20:22:11

标签: perl

我正在尝试将输出格式化为类似列。我正在尝试使用printf函数。

这就是我所拥有的:

printf("%s %10s %12s %10s\n", "Qty", "Desc.", "Unit \$", "Total");

for ($he = 0; $he <= 6; $he++) {
    if (@quantity[$he] != 0) {
        printf("%d %10s %12.2f %10.2f\n", @quantity[$he], @selections[$he], @prices[$he], @prices[$he] * @quantity[$he])
    }
}

我正在努力使if循环的for语句中的第二个printf与“Qty”,“Desc。”,“Unit \ $”对齐。和“总计。”

2 个答案:

答案 0 :(得分:1)

您需要使用两种格式的相同数字:

printf("%3s %10s %15s %13s\n", "Qty", "Desc.", "Unit \$", "Total");

printf("%3d %10s %12.2f %10.2f\n", @quantity[$he], @selections[$he], @prices[$he], @prices[$he]*@quantity[$he])

注意12.2表示(12位+ 1点+ 2位),这就是我用第一种格式写15的原因。同样适用于13。


另请注意,您正在错误地访问数组元素。

而不是@quantity[$he]使用$quantity[$he]。也就是说,将@替换为$

答案 1 :(得分:1)

很久以前,Perl主要用于格式化文件。它仍然具有这些功能,但自从Perl 4.x问世以来,我还没有看到它在程序中使用过。

查看perlform文档,format函数和write函数。

我会给你一个关于代码看起来像什么的例子,除了我多年没有做过。否则,请使用printf语句。您可以使用%-10.10s类型的格式限制文本字段的大小。这说左对齐字符串,并将其填充为10个字符,但不超过10个字符。

我还建议你买一本关于 现代 Perl的书。一个会教你references

我已经重写了你的程序以使用引用。请注意,所有数据现在都在一个数组中,而不是分布在四个单独的数组上,您希望将这些数据保持在一起。

我可以通过$item[1]来讨论$item[1]->{ENTREE} ENTREE 。它更容易阅读,更易于维护。

另请注意,我已更改了for循环。在你的,你必须知道你有七个项目。如果添加了新项目,则必须更改循环。在我的作品中,我使用$#menu来获取菜单的最后一个索引。然后我使用(0..$#menu)自动从0循环到@menu数组中的最后一项。

而且,当你在它时:

  • 请注意printf语句格式。
  • 请注意use strict;use warnings;的使用。这将会遇到很多错误。
  • 请注意我使用括号和花括号来标记代码块的首选方法。这是首选方法。

而且,现在的程序:

use strict;
use warnings;

my @menu = (
    { ENTREE => "Hamburger",    PRICE => 3.49, QUANTITY => 3 },
    { ENTREE => "Frankfurter",  PRICE => 2.19, QUANTITY => 0 },
    { ENTREE => "French Fries", PRICE => 1.69, QUANTITY => 0 },
    { ENTREE => "Large Coke",   PRICE => 1.79, QUANTITY => 4 },
    { ENTREE => "Medium Coke",  PRICE => 1.59, QUANTITY => 0 },
    { ENTREE => "Small Coke",   PRICE => 1.39, QUANTITY => 0 },
    { ENTREE => "Onion Rings",  PRICE => 1.19, QUANTITY => 8 },
);

printf "%-3.3s %-10.10s %-6.6s %s\n\n", 'Qty', 'Desc.', 'Unit $', 'Total';

# Use $#menu to get the number of items in the array instead of knowing it's 6

foreach my $item (0..$#menu) {

    # Dereference $menu[$item] to make $menu_item a hash
    # This makes the syntax easier to read.
    my %menu_item = %{ $menu[$item] };

    if ( $menu_item{QUANTITY} ) {
        printf "%3d %-10.10s %9.2f %7.2f\n",
        $menu_item{QUANTITY}, $menu_item{ENTREE}, $menu_item{PRICE},
        $menu_item{QUANTITY} * $menu_item{PRICE};
    }
}

输出:

Qty Desc.      Unit $ Total

  3 Hamburger  3.49   10.47
  4 Large Coke 1.79    7.16
  8 Onion Ring 1.19    9.52