2017-12-29 32 views
-1
#!/usr/bin/perl 

use strict; 
use warnings; 
use utf8; 
use open ':encoding(UTF-8)', ':std'; 
use List::Util qw(sum); 

my $filename = 'data1.txt'; 

open(my $fh, '<:encoding(UTF-8)', $filename) 
    or die "Could not open file '$filename' $!"; 

while (my $row = <$fh>) { 
    chomp $row; 
    print "$row\n"; 
} 

my $filename2 = 'data2.txt'; 

open(my $fh2, '<:encoding(UTF-8)', $filename2) 
    or die "Could not open file '$filename2' $!"; 

while (my $row = <$fh2>) { 
    chomp $row; 
    print "$row\n"; 
} 

my @last =(); 

my %grades = (
    Ahmet => { 
     quiz1 => 97, 
     quiz2 => 67, 
     quiz3 => 93, 
    }, 
    Su => { 
     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){ 
    push @last, "$name: $sum{$name}\n"; 
} 

my %grades2 = (
    Bugra => { 
     quiz1 => 33, 
     quiz2 => 41, 
     quiz3 => 59, 
    }, 
    Lale => { 
     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){ 
    push @last, "$name: $sum2{$name}\n"; 
} 

my @last1 = sort { lc($a) cmp lc($b) } @last; 

print @last1; 

Das ist mein Code. Ich möchte Werte aus einer Textdatei wie (heiraten 10 65 23) und schreibe in ein zweidimensionales Array. Ich verwaltete Array separat Ende der gelesenen Textdatei es wie grade1 und grade2 für data1.txt und data2.txt gesehen werden muss. Ich kann die Werte ziehen, aber ich konnte nicht in ein zweidimensionales Array schreiben. Auch das Ergebnis ist korrekt.Lesen von Textdateien und Schreiben in ein zweidimensionales Array in Perl?

+0

Ahmet: 257 Bugra: 133 Lale: 172 Su: 269 My Ausgabe ist korrekt, aber es nimmt Werte von grade1 und grade2, die ich von Textdateien nehmen möchte. –

+0

'my @ foo =();' ist redundant: 'my @foo;' erstellt bereits ein leeres Array. – melpomene

+0

Zeigen Sie Beispiel-Eingabe-/Ausgabedaten an und stellen Sie eine spezifischere Frage als "Wie mache ich das?". – melpomene

Antwort

0

las ich Ihre Frage so Wie fülle ich das Hashes %grade1 und %grade2 aus den Dateien data1.txt und data2.txt?

Ich gehe davon aus, dass Ihre Dateien data1.txt und data2.txt die folgende Struktur aufweisen (Leerzeichen getrennt):

marry 10 65 23 
john 20 30 40 

Ich schlage vor, eine Funktion zu schreiben, die den Dateinamen als Paramater nimmt und gibt einen Verweis auf ein besiedeltes hash:

sub read_grades_from_file 
{ 
    my $filename = shift; 
    my $result = {}; 

    open(my $fh, '<:encoding(UTF-8)', $filename) 
     or die "Could not open file '$filename' $!\n"; 
    while (my $row = <$fh>) { 
     next unless $row =~ /\S/; # skip empty lines 
     my ($name, $quiz1, $quiz2, $quiz3) = split(' ', $row); 
     $result->{$name} = { 
      quiz1 => $quiz1, 
      quiz2 => $quiz2, 
      quiz3 => $quiz3, 
     }; 
    } 
    close($fh); 
    return $result; 
} 

Die Funktion wird wie folgt verwendet:

my $result = read_grades_from_file('data1.txt'); # returns hashref 
my %grade1 = %{$result};       # dereference $result to make it a hash 

$result = read_grades_from_file('data2.txt'); 
my %grade2 = %{$result}; 

Das Ergebnis ist eine read_grades_from_fileReferenz auf einen Hash so dass es zu %gradedereferenzierte und dann zugeordnet werden muss. Also die zwei Schritte.

+0

das ist Arbeit danke. Aber ich möchte Textvariablen in einem Array.Ich tue das, aber es dauert erste Zeile des Textes als Array-Eingabe und ich will nicht, dass es dauert, dass @array ("Ahmet 36 45 76 "," chris 34 95 20 ") –

+0

@FatihTEKE Ich weiß nicht, was du meinst. Sie haben die *** Hashes *** '% grade1' und'% grade2' und sprechen nun über *** Arrays ***. Weil Sie nicht zeigen, was Sie wirklich wollen, ist es nicht möglich, Ihnen zu helfen. – PerlDuck

0

Vielleicht sind die Datenstrukturen, die Sie verwenden, übermäßig komplex. Sie benötigen zum Beispiel wahrscheinlich nur einen einzigen %grades Hash.

Im Folgenden werden Daten aus durch Leerzeichen oder Tabulatoren getrennten Datensätzen aus den beiden Eingabedateien übernommen - Kommentare oder leere Zeilen werden ignoriert.

my %grades; 
while (1) { 
    my $row1 = <$data1>; 
    my $row2 = <$data2>; 
    last unless (defined $row1 or defined $row2); 
    chomp ($row1, $row2); 
    if (defined $row1 and $row1 !~ /(^#|^$)/) { 
    my ($name, @quizzes) = split /[ \t]/, $row1, 4; 
    $grades{$name}{'grades1'} = sum(@quizzes); 
    } 
    if (defined $row2 and $row1 !~ /(^#|^$)/) { 
    my ($name, @quizzes) = split /[ \t]/, $row2, 4; 
    $grades{$name}{'grades2'} = sum(@quizzes); 
    } 
} 

Um auf STDOUT zu drucken, könnten Sie Folgendes versuchen.

print "Name\tMarks 1\tMarks 2", $/; 

for (keys %grades) { 
    my $name = $grades{$_}; 
    print $_, "\t", $name->{grades1} || '?', "\t", $name->{grades2} || '?', "\t", $/; 
} 

Mit data1.txt als

# Grades 
Bugra 33 41 59 
Mary 10 65 23 
Lale 79 31 62 

und data2.txt als

# Grades 2 
Bugra 49 32 57 
Lale 79 31 62 
Peter 21 34 42 

der Ausgang unten gezeigt.

Name Marks 1 Marks 2 
Peter ?  97 
Lale 172  172 
Bugra 133  138 
Mary 98  ? 

('?' A zeigt an, dass kein Eintrag für den angegebenen Schüler in einem der beiden Eingabedateien vorhanden ist.)

Verwandte Themen