2017-12-29 71 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; 

これは私のコードです。私は、テキストファイルから(結婚10 65 23)のような値を取って2次元配列に書きたいと思っています。私はgrade1grade2data1.txtdata2.txtのように見なければならない読み込まれたテキストファイルの別の端を管理しました。値を引き出すことはできますが、2次元配列に書き込むことはできませんでした。結果は正しい。テキストファイルを読み込んで、2次元配列にperlで書き込みますか?

+0

アフメット:257 Bugra:133 ララ:172 蘇:269 マイ出力は正しいですが、テキストファイルから取りたいGrade1とGrade2の値が必要です。 –

+0

'my @foo =();'は冗長です: 'my @foo;'はすでに空の配列を作成しています。 – melpomene

+0

サンプルの入出力データを表示し、「どのようにこれを行うのですか?」より具体的な質問をしてください。 – melpomene

答えて

0

私は、ファイルdata1.txtdata2.txtからハッシュ%grade1%grade2を移入するにはどうすればよいとしてあなたの質問を読んで?

marry 10 65 23 
john 20 30 40 

は私がのparamaterとしてファイル名を取り、人口への参照を返す関数を書くことをお勧め:

私はまた、あなたのファイルdata1.txtdata2.txtは、次の構造(空白区切り)を持っていることを前提としハッシュは、次のよう

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

関数が使用される:

それは デ参照し、次に %gradeに割り当てなければならないので read_grades_from_fileの0
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}; 

結果がハッシュへ参照あります。したがって、2つのステップ。

+0

それは仕事の感謝です。しかし、私は配列にテキスト変数を入れたいです。私はそれをやっているが、それは配列の入力としてテキストの最初の行を取ると私はそれを必要としませんそれは@アレイ( "ahmet 36 45 76 "、" chris 34 95 20 ") –

+0

@FatihTEKEあなたが何を意味するのか分かりません。あなたは***ハッシュ*** '%grade1'と'%grade2'を持っていて、***配列***について話します。あなたが本当に望んでいるものを示していないので、あなたを助けることはできません。 – PerlDuck

0

おそらく、使用しているデータ構造があまりにも複雑です。おそらく、単一の%gradesハッシュだけが必要です。

以下は、コメントまたは空白行を無視して、2つの入力ファイルの両方から、スペースまたはタブで区切られたレコードからデータを取得します。

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); 
    } 
} 

STDOUTに印刷するには、次の方法があります。

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

として

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

とdata2.txtとしてdata1.txtで

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

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

出力を以下に示します。

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

は( '?' Aは、レコードが2つの入力ファイルのいずれかで指定された学生のために存在していないことを示している。)

関連する問題