2017-12-26 12 views
0

das ist mein Code.Am Ende dieses Prozesses möchte ich Name und Summe Ergebnisse mit aufsteigender Reihenfolge sammeln und drucken wollen.Ich habe versucht, die als @ sum1 und @ sum2 nehmen, aber es konnte @sum Funktionen nicht wissen kann ich das tun oder jede Idee wird sehr wertvoll sein.zweidimensionale Hash-Datenausgabe?

#!/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

ich neu formatiert nur Ihren Code weil es völlig unlesbar war. Sie sind willkommen, aber bitte machen Sie das nächste Mal selbst. – PerlDuck

+1

Was ist Ihre Ausgabe und was möchten Sie stattdessen? – PerlDuck

+0

Ich bin neu bei Perl Entschuldigung. Erstmal danke für Interesse. Ich habe versucht, zu bearbeiten Ich verwendete splice Befehl zum Löschen von Elementen aus Array, aber es wird so lang. Das ist genug für mich danke.Ich habe versucht, Ausgabe aufsteigende Reihenfolge und Sortierbefehl genug, um das zu tun .. – keremmmmmm

Antwort

1

Sie scheinen einige Informationen in Ihrem Code zu duplizieren. Sobald Sie die% -Noten eingegeben haben, müssen Sie den% -Hash nicht mehr erstellen. Er kann direkt aus den% -Noten extrahiert werden.

Um die Hashes zu füllen, müssen Sie die Schlüssel nicht ständig wiederholen, beschreiben Sie die Unterstruktur wie unten gezeigt.

Ihr Code enthält auch "ı", das kein ASCII-Zeichen ist. Es wäre netter, Perl zu sagen, dass man utf8 benutzt und auch die Kodierung der Ausgabe deklariert.

die Ausgabe von Summen zu sortieren, verwenden, um die Funktion sort mit einem benutzerdefinierten Block, der die Hash-Elemente vergleicht:

#!/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

Hier ist ein Weg, dies zu tun. Sie sind ein Hash-Hash-ref zu schaffen, die explizit wie dies geschehen ist (ich habe noch einen Student hinzugefügt, um das Beispiel interessanter zu machen):

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

Um die Studenten und ihre Noten zu drucken, können Sie verwenden:

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

Um die Summe für jeden Schüler zu generieren:

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

ich sum0 verwenden, die 0 statt undef zurückkehren wird, wenn Die Liste ist leer. Sie sollten use List::Util qw(sum0); am Anfang verwenden.

Dann Drucke die erzeugten Summe in aufsteigender Reihenfolge:

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

Für die umgekehrte Reihenfolge, können Sie sort { $sums{$b} <=> $sums{$a} } keys %sums verwenden. Für den Rest des Codes, würden Sie das gleiche ...

Die Ausgabe der Studenten:

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

Dann wird die Summe der Qualitäten:

Ahmet: 257 
Mehmet: 269 
Abdul: 287 
+0

vielen Dank. Das ist andere Ansatz gute Sicht. – keremmmmmm