Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 二维散列数据输出?_Perl_Sorting_Join_Hash_Printing - Fatal编程技术网

Perl 二维散列数据输出?

Perl 二维散列数据输出?,perl,sorting,join,hash,printing,Perl,Sorting,Join,Hash,Printing,这是我的代码。在这个过程结束时,我想按升序收集名称和求和结果并打印。我尝试使用as@sum1和@sum2,但它不知道@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}

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

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

要填充散列,您不必一直重复键,请描述子结构,如下所示

此外,您的代码包含“ı”,它不是ASCII字符。最好告诉Perl使用并声明输出的编码

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

#!/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";
  }
#/usr/bin/perl
严格使用;
使用警告;
使用utf8;
使用open':编码(UTF-8)':std';
使用列表::Util qw(总和);
我的%成绩=(
艾哈迈特=>{
quiz1=>97,
quiz2=>67,
quiz3=>93,
},
Mehmet=>{
quiz1=>88,
quiz2=>82,
quiz3=>99,
}
);
我的%sum;
对于我的$姓名(关键字%)
{
$sum{$name}=sum(值%{$grades{$name});
}
对于我的$name(排序{$sum{$a}$sum{$b}}键%sum)
{
打印$name,,$sum{$name},“\n”;
}
我的%grades2=(
Merve=>{
quiz1=>33,
quiz2=>41,
quiz3=>59,
},
Aslı=>{
quiz1=>79,
quiz2=>31,
quiz3=>62,
},
);
我的%sum2;
对于我的$name(关键字%grades2)
{
$sum2{$name}=sum(值%{$grades2{$name});
}
对于我的$name(排序{$sum2{$a}$sum2{$b}}键%sum2)
{
打印$name,,$sum2{$name},“\n”;
}

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

要填充散列,您不必一直重复键,请描述子结构,如下所示

此外,您的代码包含“ı”,它不是ASCII字符。最好告诉Perl使用并声明输出的编码

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

#!/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";
  }
#/usr/bin/perl
严格使用;
使用警告;
使用utf8;
使用open':编码(UTF-8)':std';
使用列表::Util qw(总和);
我的%成绩=(
艾哈迈特=>{
quiz1=>97,
quiz2=>67,
quiz3=>93,
},
Mehmet=>{
quiz1=>88,
quiz2=>82,
quiz3=>99,
}
);
我的%sum;
对于我的$姓名(关键字%)
{
$sum{$name}=sum(值%{$grades{$name});
}
对于我的$name(排序{$sum{$a}$sum{$b}}键%sum)
{
打印$name,,$sum{$name},“\n”;
}
我的%grades2=(
Merve=>{
quiz1=>33,
quiz2=>41,
quiz3=>59,
},
Aslı=>{
quiz1=>79,
quiz2=>31,
quiz3=>62,
},
);
我的%sum2;
对于我的$name(关键字%grades2)
{
$sum2{$name}=sum(值%{$grades2{$name});
}
对于我的$name(排序{$sum2{$a}$sum2{$b}}键%sum2)
{
打印$name,,$sum2{$name},“\n”;
}

这里有一个方法。您正在创建hash ref的散列,具体操作如下(为了使示例更有趣,我又添加了一个学生):

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

# 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
,而不是
unde
。您应该使用
use List::Util qw(sum0)在开头

然后按升序打印生成的和:

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

Ahmet:  257
Mehmet: 269
Abdul:  287

这里有一个方法。您正在创建hash ref的散列,具体操作如下(为了使示例更有趣,我又添加了一个学生):

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

# 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
,而不是
unde
。您应该使用
use List::Util qw(sum0)在开头

然后按升序打印生成的和:

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

Ahmet:  257
Mehmet: 269
Abdul:  287

我刚刚重新格式化了你的代码,因为它完全不可读。欢迎您,但请您下次自己做。您的输出是什么?您希望它是什么?我是perl新手。对不起。首先感谢您的兴趣。我尝试编辑我使用了splice命令从数组中删除项,但它太长了。这对我来说已经足够了。再次感谢。我尝试将输出升序和排序我只是重新格式化了你的代码,因为它完全不可读。欢迎您,但请您下次自己做。您的输出是什么?您希望它是什么?我是perl新手。对不起。首先感谢您的兴趣。我尝试编辑我使用了splice命令从数组中删除项,但它太长了。这对我来说已经足够了。再次感谢。我尝试将输出升序和排序命令足够做那件事。。