2017-12-26 15 views
0

このコードはこのプロセスの最後です。昇順で名前と合計の結果を集めて印刷したいと思います。@ sum1と@ sum2を取ろうとしましたが、@sumの機能を知ることができませんでした。私はそれを行うことができますか、または任意のアイデアは非常に貴重になるでしょ二次元ハッシュデータ出力?

#!/usr/bin/perl 

use strict; 
use warnings; 
use List::Util qw(sum); 
use Data::Dumper qw(Dumper); 

my %grades; 
$grades{"Ahmet"}{quiz1} = 97; 
$grades{"Ahmet"}{quiz2} = 67; 
$grades{"Ahmet"}{quiz3} = 93; 
$grades{"Mehmet"}{quiz1} = 88; 
$grades{"Mehmet"}{quiz2} = 82; 
$grades{"Mehmet"}{quiz3} = 99; 

print Dumper \%grades; 
print "----------------\n"; 

foreach my $name (sort keys %grades) { 
    my %hash1 = (
     'Ahmet' => [ 97, 67, 93 ], 
     'Mehmet' => [ 88, 82, 99 ], 
    ); 

    my @sums; 
    for my $key (keys %hash1) { 
     my $sum = sum @{ $hash1{$key} }; 
     push @sums, "$key: $sum\n"; 
    } 

    foreach my $sum (keys %{ $grades{$name} }) { 
     print "$name : $grades{$name}{$sum}\n"; 
    } 

    print @sums; 
} 

foreach my $name (sort keys %grades) { 
    print "$grades{$name}\n"; 
} 

my %grades2; 
$grades2{"Merve"}{quiz1} = 33; 
$grades2{"Merve"}{quiz2} = 41; 
$grades2{"Merve"}{quiz3} = 59; 
$grades2{"Aslı"}{quiz1} = 79; 
$grades2{"Aslı"}{quiz2} = 31; 
$grades2{"Aslı"}{quiz3} = 62; 

print Dumper \%grades2; 
print "----------------\n"; 

foreach my $name2 (sort keys %grades2) { 
    my %hash = (
     'Merve' => [ 33, 41, 59 ], 
     'Aslı' => [ 79, 31, 62 ], 
    ); 

    my @sums2; 
    for my $key (keys %hash) { 
     my $sum = sum @{ $hash{$key} }; 
     push @sums2, "$key: $sum\n"; 
    } 

    foreach my $sum (keys %{ $grades2{$name2} }) { 
     print "$name2 : $grades2{$name2}{$sum}\n"; 
    } 

    print @sums2; 

} 

foreach my $name2 (sort keys %grades2) { 
    print "$grades2{$name2}\n"; 
} 

my %info; 

$info{$_} .= "A" for keys %grades; 
$info{$_} .= "B" for keys %grades2; 

for (sort keys %info) { 
    print "$_ : $info{$_}\n"; 
} 
+2

私はちょうどあなたのコードを再フォーマットそれは完全に判読できなかったからです。歓迎ですが、次回は自分でやってください。 – PerlDuck

+1

あなたの出力は何ですか?代わりに何をしたいですか? – PerlDuck

+0

私はperlで初めてです。まずは興味を持っていただき、ありがとうございます。配列からアイテムを削除するスプライスコマンドを編集しようとしましたが、長くなってしまいました。私はもう一度感謝します。私は出力を昇順にしようとしていました。ソートコマンドはそれを行うのに十分です。 – keremmmmmm

答えて

1

コードに情報が重複しているようです。 %等級を入力すると、%ハッシュを作成する必要はありません。%等級から直接抽出することができます。

ハッシュを作成するには、キーを常に繰り返す必要はありません。以下に示すように、下部構造を記述します。

また、コードには「ı」が含まれています。これはASCII文字ではありません。 Perlにutf8を使用し、出力のエンコーディングを宣言することを伝えるほうが良いでしょう。

ハッシュの要素を比較するカスタムブロックでsort機能を使用し、合計で出力をソートするに:ここで

#!/usr/bin/perl 
use strict; 
use warnings; 
use utf8; 
use open ':encoding(UTF-8)', ':std'; 

use List::Util qw(sum); 

my %grades = (
    Ahmet => { 
     quiz1 => 97, 
     quiz2 => 67, 
     quiz3 => 93, 
    }, 
    Mehmet => { 
     quiz1 => 88, 
     quiz2 => 82, 
     quiz3 => 99, 
    } 
); 

my %sum; 
for my $name (keys %grades) 
    { 
    $sum{$name} = sum(values %{ $grades{$name} }); 
} 
for my $name (sort { $sum{$a} <=> $sum{$b} } keys %sum) 
    { 
    print $name, ' ', $sum{$name}, "\n"; 
    } 

my %grades2 = (
    Merve => { 
     quiz1 => 33, 
     quiz2 => 41, 
     quiz3 => 59, 
    }, 
    Aslı => { 
     quiz1 => 79, 
     quiz2 => 31, 
     quiz3 => 62, 
    }, 
); 

my %sum2; 
for my $name (keys %grades2) 
    { 
    $sum2{$name} = sum(values %{ $grades2{$name} }); 
    } 
for my $name (sort { $sum2{$a} <=> $sum2{$b} } keys %sum2) 
    { 
    print $name, ' ', $sum2{$name}, "\n"; 
    } 
1

はそれを行うための方法です。あなたが使用することができ、学生とその成績を、印刷するには

my %grades = (
    'Ahmet' => { 
    quiz1 => 97, 
    quiz2 => 67, 
    quiz3 => 93, 
    }, 
    'Mehmet' => { 
    quiz1 => 88, 
    quiz2 => 82, 
    quiz3 => 99, 
    }, 
    'Abdul' => { 
    quiz1 => 99, 
    quiz2 => 89, 
    quiz3 => 99, 
    }, 
); 

:あなたは明示的にこの(私は例をより面白くするために、1人の以上の学生が追加されている)のように行われているハッシュリファレンスのハッシュを作成している

# Printing the students and grades 
foreach my $student (keys %grades) { 
    print $student, ":\n"; 
    foreach my $test (keys %{$grades{$student}}) { 
    print " - ", $test, "\t", $grades{$student}{$test}, "\n"; 
    } 
} 

は、各学生のための和を生成するには、次戻ります私はsum0を使用

# Generating a sum for each student 
my %sums; 
foreach my $student (keys %grades) { 
    $sums{$student} = sum0 map { $grades{$student}{$_} } keys %{$grades{$student}}; 
} 

0代わりにundef与えられたリストは空です。最初にuse List::Util qw(sum0);を使用する必要があります。

はその後昇順で生成された合計を印刷:

# Printing the sum 
foreach my $student (sort { $sums{$a} <=> $sums{$b} } keys %sums) { 
    print $student, ":\t", $sums{$student}, "\n"; 
} 

逆の順序について、あなたはsort { $sums{$b} <=> $sums{$a} } keys %sumsを使用することができます。あなたのコードの残りの部分について、あなたは同じことをするだろう...

学生の出力:

Ahmet: 
- quiz1  97 
- quiz3  93 
- quiz2  67 
Mehmet: 
- quiz2  82 
- quiz3  99 
- quiz1  88 
Abdul: 
- quiz2  89 
- quiz3  99 
- quiz1  99 

は、その後の成績の合計:

Ahmet: 257 
Mehmet: 269 
Abdul: 287 
+0

ありがとうございます。これは別のアプローチ良い見解です。 – keremmmmmm