-1

Perl:Input 5 mobile set details (Invoice number, Model , Company, Memory , Price , Quantity ) に質問があります。すべての詳細、合計金額 (数量 * 価格)、合計数量、各社の携帯電話の数を印刷します。

私のスクリプトは次のとおりです。

#!/usr/bin/perl

my %mobset = (
    '1' => {
        'Invoice No' =>'3456',
        'Model'      =>'S9900',
        'Company'    =>'Sonyericcson',
        'Memory'     =>'1GB',
        'Price'      =>'8000',
        'Qnty'       =>'1',
    },
    '2' => {
        'Invoice No' => '3457',
        'Model'      => 'S3322',
        'Company'    => 'Samsung',
        'Memory'     => '2GB',
        'Price'      => '9000',
        'Qnty'       => '2',
    },
    '3' => {
        'Invoice No' => '3458',
        'Model'      => 'N4140',
        'Company'    => 'Nokia',
        'Memory'     => '512MB',
        'Price'      => '5000',
        'Qnty'       => '2',
    },
    '4' => {
        'Invoice No' => '3459',
        'Model'      => 'S4636',
        'Company'    => 'Samsung',
        'Memory'     => '256MB',
        'Price'      => '6000',
        'Qnty'       => '1',
    }, 
    '5' => {
        'Invoice No' => '3460',
        'Model'      => 'S7854',
        'Company'    => 'Samsung',
        'Memory'     => '128MB',
        'Price'      => '7000',
        'Qnty'       => '1',
    }
);

print "All the mobile set details are as follows:\n";
foreach my $id(sort keys %mobset) {

    print "Mobile SlNo. = $id, Invoice No. = $mobset{$id}{'Invoice No'}, Model No. = $mobset{$id}{'Model'}, CompanyName = $mobset{$id}{'Company'}, Memory = $mobset{$id}{'Memory'}, Price = $mobset{$id}{'Price'}, Quantity = $mobset{$id}{'Qnty'}\n";

    $totqty += $mobset{$id}{'Qnty'};
    $totprice += $mobset{$id}{'Price'};
}

print "Total Quantity of mobile set is $totqty\n";
$totamt = $totqty * $totprice;
print "Total Amount of mobile set is Rs.$totamt\n";

print "The company names of mobile are:\n";
foreach my $id(sort keys %mobset) {

    print "$mobset{$id}{'Company'}\n"; 
}

$name = SonyericcsonSamsungNokiaSamsungSamsung;
my @names = ($name =~ m/([A-Z][a-z]+)/g);
join(',',@names);
my %count;

foreach (@names) {

    if (exists $count{$_}) {

        $count{$_}++;
    } 
    else {

        $count{$_} = 1;
    }
}

print "The number of mobiles from each company are:\n";
foreach (keys %count)  {

    print "$_ \t = $count{$_}\n";
}

私の出力は次のとおりです。

All the mobile set details are as follows:
Mobile SlNo. = 1, Invoice No. = 3456, Model No. = S9900, CompanyName = Sonyericcson, Memory = 1GB, Price = 8000, Quantity = 1
Mobile SlNo. = 2, Invoice No. = 3457, Model No. = S3322, CompanyName = Samsung, Memory = 2GB, Price = 9000, Quantity = 2
Mobile SlNo. = 3, Invoice No. = 3458, Model No. = N4140, CompanyName = Nokia, Memory = 512MB, Price = 5000, Quantity = 2
Mobile SlNo. = 4, Invoice No. = 3459, Model No. = S4636, CompanyName = Samsung, Memory = 256MB, Price = 6000, Quantity = 1
Mobile SlNo. = 5, Invoice No. = 3460, Model No. = S7854, CompanyName = Samsung, Memory = 128MB, Price = 7000, Quantity = 1
Total Quantity of mobile set is 7
Total Amount of mobile set is Rs.245000
The company names of mobile are:
Sonyericcson
Samsung
Nokia
Samsung
Samsung
The number of mobiles from each company are:
Sonyericcson = 1
Nokia = 1
Samsung = 3

しかし、想定されていないモバイル名をハードコーディングしたため、モバイル数の o/p を取得しています。どうすればコードを解決できますか?

4

3 に答える 3

0

ハードコードは本当に必要ありません。あなたはその名前を知っています-それはあなたが歩いているhasrefにあります。会社の値に基づいてカウント配列を作成するだけです

my %count;
foreach my $id (sort keys %mobset) {
    ++$count{$mobset{$id}->{Company}};
}

print "The number of mobiles from each company are:\n";
foreach (keys %count)  {

    print "$_ \t = $count{$_}\n";
}
于 2012-10-18T08:09:45.093 に答える
0

カウントを収集するコードのフラグメントを次のように変更します。

my %count;
foreach my $key ( %mobset ) {
   my $name = $mobset{$key}{Company} ;
   $count{$name}++ ;
}

または、前のループに含めることをお勧めします。

print "The company names of mobile are:\n";
foreach my $id(sort keys %mobset) {

    my $name = $mobset{$id}{Company}; 
    print "$name\n" ;
    $count{$name}++
}

ご了承ください

  1. {Company}配列のキーにある引用符を削除しても問題ないので、代わりに{'Company'}, と書くことができます。
  2. 未定義のハッシュ要素をインクリメントしても問題ない (0 として扱われる) ため、要素が存在するかどうかを確認する必要はありません。
于 2012-10-18T08:06:37.860 に答える
0

モバイル名は、foreach my $id(sort keys %mobset)ループの前に印刷した名前ですよね? そのような別のループを実行するか、そのループ中に名前を配列に保存して使用することができます。

于 2012-10-18T08:07:17.133 に答える