2012-10-18 105 views
-1

我有Perl的問題:輸入5移動設置的詳細信息(發票號碼,型號,公司,內存,價格,數量)。打印所有細節,總金額(數量*價格),總數量,每家公司的手機數量。哈希哈希在Perl中

我的腳本是:

#!/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爲手機的號碼,因爲我沒有硬編碼這我不應該移動的名稱至。我如何解決代碼?

+1

我不明白你的問題,請澄清。什麼是o/p?預期產出會是多少? 「移動名稱」是否與「模型」相同,如果是,您應該做什麼而不是硬編碼? – January

+0

@一月'o/p'=='輸出'。 – Barmar

+0

手機名稱是指公司。輸出是完美的。但根據這個問題,我不應該硬編碼 - >我的$ name =「SonyericcsonSamsungNokiaSamsungSamsung」;如果我對此進行硬編碼,我很容易找到每家公司的手機數量。但我想通過腳本打印每家公司的手機號碼,而不用硬編碼。 – user1613245

回答

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"; 
} 
+0

謝謝你,先生 – user1613245

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)是可以的,所以不需要檢查元素是否存在。
+0

非常感謝。 – user1613245

0

移動名稱是您先前在foreach my $id(sort keys %mobset)循環中打印的名稱,不是嗎?你可以這樣做另一個循環,或者你可以在這個循環中將這些名字保存在一個數組中,然後使用它。

+0

是的,先生。那是我想要的。請你能幫我解釋一下代碼嗎? – user1613245

+0

查看1月的答案,它有詳細的代碼。 – Barmar