2

こんにちは私はクラス名、登録された学生の数と学生の名前を含むハッシュのハッシュを持っています。
第2レベルのキーを繰り返さずにこのハッシュを印刷するにはどうすればよいですか。
例:ハッシュに入力するデータは、サイエンスクラス、3人の生徒、つまりジョージ、リサ、マティアス、数学のクラス、4人の生徒がピーター、ジョージ、アンナ、マーティンです。

my %register=();

$register{$className}->{$count_students}=$student_name; # Fill the hash.

  foreach my $key ( keys %register ){      

   print "$key: ";

   foreach my $class ( keys %{ $register{$key} } ){

       print "$class=$register{$key}->{$class}\n";

   }  
}

次のような結果が得られます:

Science_class:2 = Lisa
1 = George
3 = Mathias
Math_class:2 = Anna
1 = Martin
3 = Peter
4 = George

しかし、私は私の結果を次のようにしたいと思います:

Science_class:3-> Lisa、George、Mathias
Math_class:4-> Anna、Martin、Peter、George

スクリプトを修正するにはどうすればよいですか?手伝ってください。

4

3 に答える 3

5

スカラーコンテキストの関数を使用して第2レベルのエントリ数を取得でき、keys関数を使用して第2レベルの値のみを取得できますvalues

#!/usr/bin/perl

use strict;
use warnings;

my %register = (
    Science_class => {
        1 => "George",
        2 => "Lisa",
        3 => "Mathias",
    },
    Math_class => {
        1 => "Martin",
        2 => "Anna",
        3 => "Peter",
        4 => "George",
    }
);

for my $class (keys %register) {
    print "$class: ", scalar keys %{$register{$class}},
        " ", join(", ", values %{$register{$class}}), "\n";
}

ただし、データの構造を考えると、arrayrefsのハッシュの方が理にかなっています。

#!/usr/bin/perl

use strict;
use warnings;

my %register = (
    Science_class => [
        "George",
        "Lisa",
        "Mathias",
    ],
    Math_class => [
        "Martin",
        "Anna",
        "Peter",
        "George",
    ]
);

for my $class (keys %register) {
    print "$class: ", scalar @{$register{$class}},
        " ", join(", ", @{$register{$class}}), "\n";
}

perldoc perldscPerl5でデータ構造を作成および操作する方法を理解するのに役立つ読み物が見つかるかもしれません。

于 2011-07-12T13:57:45.580 に答える
2

スカラーコンテキストでは、キーはハッシュ内のキーの数を返します。配列コンテキストでは、これらのキーの配列を返します。内側のループに入る前に、クラスの名前に続いてそのクラスの生徒の数を印刷して、その数を2回以上印刷しないようにします。

$numkeys = keys $register{$key};
print "$key: $numkeys ->";

その配列内の名前が続きます。名前を表示するために内部ループを作成する必要はありません。キーを使用するだけです。

print join(", ", keys $register{$key});
于 2011-07-12T13:52:05.480 に答える
1

構造内の生徒数を数えるだけなので、各クラスの生徒数を保存する必要はありません。(したがって、構造が変更されてもカウントが同期しなくなりません。)次のような配列のハッシュを使用することをお勧めします。

use strict;
use warnings;

my %register;

# populate the hash, e.g.:
my $classname = 'science_class';
push @{ $register{$classname} }, 'Lisa';
push @{ $register{$classname} }, 'George';
push @{ $register{$classname} }, 'Mathias';

# print the results:

foreach my $class( sort keys %register ) { 
    print $class, ' : ';
    my @students = @{ $register{$class};
    print scalar( @students ), ' = ';   # number of elements in the array
    print join ', ', @students;
    print "\n";
}
于 2011-07-12T13:59:16.887 に答える