很久以前,Perl 主要用于格式化文件。尽管自 Perl 4.x 出现以来我还没有看到它在程序中使用过,但它仍然具有这种功能。
查看perlform文档、format函数和write函数。
我会给你一个关于代码是什么样子的例子,除非我已经多年没有这样做了。否则,使用该printf
语句。您可以使用一种格式来限制文本字段的大小%-10.10s
。这表示左对齐字符串,并将其填充到 10 个字符,但不超过 10 个字符。
我还建议你买一本关于现代Perl 的书。一个会教你参考的。
我已经重写了您的程序以使用引用。请注意,所有数据现在都在一个数组中,而不是分布在您希望将索引保持在一起的四个单独的数组中。
我可以通过说来谈论主菜。它更易于阅读和维护。$item[1]
$item[1]->{ENTREE}
另请注意,我已经更改了您的for
循环。在你的,你必须知道你有七个项目。如果您添加了新项目,则必须更改循环。在我的,我$#menu
用来获取我的菜单的最后一个索引。然后我使用(0..$#menu)
自动从 0 循环到@menu
数组中的最后一项。
use strict;
use warnings;
use Data::Dumper;
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