【问题标题】:two dimensional hash data output?二维哈希数据输出?
【发布时间】:2018-06-07 14:07:52
【问题描述】:

这是我的代码。在此过程结束时,我想按升序收集名称和求和结果并希望打印。我尝试将 @sum1 和 @sum2 设为 as,但它不知道 @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";
}

【问题讨论】:

  • 我刚刚重新格式化了您的代码,因为它完全不可读。不客气,但下次请自己做。
  • 你的输出是什么,你希望它是什么?
  • 对不起,我是 perl 的新手。首先感谢您的关注。我尝试编辑我使用 splice 命令从数组中删除项目,但它变得如此之长。这对我来说已经足够了,再次感谢。我是试图使输出升序和排序命令足以做到这一点..

标签: perl sorting join hash printing


【解决方案1】:

您的代码中似乎重复了一些信息。填充 %grades 后,无需创建 %hash - 它可以直接从 %grades 中提取。

要填充哈希,您不必一直重复键,如下所示描述子结构。

另外,您的代码包含“ı”,它不是 ASCII 字符。通过使用utf8 并声明输出的编码来告诉 Perl 会更好。

要按总和对输出进行排序,请使用 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";
  }

【讨论】:

    【解决方案2】:

    这是一种方法。您正在创建一个 hash ref 的 hash,它是这样明确地完成的(我又添加了一个学生以使示例更有趣):

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

    我使用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} &lt;=&gt; $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
    

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多