二维哈希数据输出



这个我的代码。无法知道@sum function。我该怎么做,或者任何想法都非常有价值。

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

您似乎在代码中复制了一些信息。一旦您填充%等级,就无需创建百分比 - 可以直接从%等级中提取。

要填充哈希,您不必一直重复键,请描述下面的子结构。

另外,您的代码包含"ı",这不是ASCII字符。通过使用UTF8并宣布输出的编码是更好的。

要按总和对输出进行排序,请将排序函数与比较哈希元素的自定义块:

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

这是一种做到这一点的方法。您正在创建Hash Ref,这是这样明确完成的(我添加了一个学生以使示例更有趣):

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

要打印学生及其成绩,您可以使用:

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

为每个学生生成总和:

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

i使用sum0,当给出的列表为空时,它将返回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

最新更新