2

出力が列にあるようにフォーマットしようとしています。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ループのステートメント内の2番目のprintfforが、「Qty」、「Desc。」、「Unit \ $」、および「Total」と一致するようにしようとしています。

4

2 に答える 2

1

2つの形式で同じ番号を使用する必要があります。

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]。つまり、をに置き換え@ます$

于 2012-10-23T20:26:28.190 に答える
1

昔は、Perlは主にファイルのフォーマットに使用されていました。Perl 4.xがリリースされて以来、プログラムで使用されているのを見たことがありませんが、これらの機能はまだあります。

perlformのドキュメント、format関数、およびwrite関数を確認してください。

私が何年もしていないことを除いて、コードがどのように見えるかの例を示します。printfそれ以外の場合は、ステートメントを使用してください。%-10.10sフォーマットのタイプを使用して、テキストフィールドのサイズを制限できます。これは、文字列を左揃えにし、10文字までパディングすることを意味しますが、10文字を超えないようにします。

また、現代のPerlに関する本を入手することをお勧めします。参照について教えてくれるもの。

参照を使用するようにプログラムを書き直しました。インデックスをまとめておく必要がある4つの別々の配列に分散するのではなく、すべてのデータが1つの配列になっていることに注意してください。

のENTREEについては$item[1]、と言うことで話すことができます$item[1]->{ENTREE}。読みやすく、保守も簡単です。

forまた、ループを変更したことにも注意してください。あなたの中で、あなたはあなたが7つのアイテムを持っていることを知らなければなりませんでした。新しいアイテムを追加した場合は、ループを変更する必要があります。$#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
于 2012-10-24T00:22:07.943 に答える