2012-10-18 2 views
-1

나는 Perl : 입력 5 모바일 세트 세부 정보 (송장 번호, 모델, 회사, 메모리, 가격, 수량)에 질문이 있습니다. 각 회사의 모든 세부 사항, 총 금액 (수량 * 가격), 총 수량, 모빌 수를 인쇄하십시오.해시 해시의 Perl

내 스크립트입니다 :

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를 얻고있다 :

#!/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"; 
} 

내 출력은 에. 코드를 어떻게 풀 수 있습니까?

+1

질문을 이해할 수 없으므로 명확히하십시오. o/p는 무엇입니까? 예상되는 결과는 무엇입니까? "모바일 이름"이 "모델"과 같습니까? 그렇다면 하드 코딩 대신 무엇을해야합니까? – January

+0

@January 'o/p'== '출력'. – Barmar

+0

모바일 이름은 회사를 의미합니다. 출력이 완벽합니다. 그러나 질문에 따르면, 나는 하드 코딩하지 않아야한다. -> my $ name = "SonyericcsonSamsungNokiaSamsungSamsung"; 하드 코딩하면 쉽게 각 회사의 휴대 전화 번호를 찾을 수 있습니다. 그러나 각 회사의 전화 번호를 하드 코드하지 않고 스크립트를 통해 인쇄하려고합니다. – user1613245

답변

0

하드 코드가 필요하지 않습니다. 당신은 그 이름을 압니다. 회사 가치에 기반한 카운트 배열을 구축하십시오.

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}을 쓸 수 있습니다. 0,
  2. 정의되지 않은 해시 요소를 증가 시켜도됩니다 (0으로 처리 됨). 요소가 존재하는지 여부를 확인할 필요가 없습니다.
+0

정말 고마워요. – user1613245

0

모바일 이름은 이전에 foreach my $id(sort keys %mobset) 루프에서 인쇄 한 이름입니다. 그렇지 않습니까? 그런 식으로 또 다른 루프를 만들거나 그 루프 동안 배열에 이름을 저장하여 사용할 수 있습니다.

+0

예. 선생님. 내가 원하는 것을 좋아합니다. 코드를 도와 주시겠습니까? – user1613245

+0

January의 답변을 참조하십시오. 상세한 코드가 있습니다. – Barmar