很久以前,Perl主要用於格式化文件。它仍然具有這些功能,儘管自從Perl 4.x發佈以來,我還沒有看到它在程序中使用。
查看perlform文檔,format函數和write函數。
我想給你一個例子,看看代碼會是什麼樣子,除非我多年沒有這樣做。否則,請使用printf
聲明。您可以用%-10.10s
格式類型來限制文本字段的大小。這表示左對齊字符串,並將其填充到10個字符,但不超過10個字符。
我也建議你拿到一本關於現代 Perl。一個會教你關於references。
我已經重寫了您的程序以使用引用。請注意,所有數據現在都在一個數組中,而不是分散在四個單獨的數組上,您希望將索引保留在一起。
我可以通過說$item[1]->{ENTREE}
來談論ENTREE的$item[1]
。閱讀起來更容易,維護也更容易。
另請注意,我已更改您的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};
}
}
OUTPUT:
Qty Desc. Unit $ Total
3 Hamburger 3.49 10.47
4 Large Coke 1.79 7.16
8 Onion Ring 1.19 9.52
這是什麼問題? –
輸出結果不一致。 –
使用'使用警告'找到4個錯誤! – ikegami