0

誰かが助けてくれることを望んでいる質問があります(私の質問を説明するために簡略化されています)。

配列のハッシュの次のハッシュがあります(とにかくそれが何であるかと思いますか?)

データ構造

{
  Cat => {
    Height => ["Tiny"],
  },
  Dog => {
    Colour => ["Black"],
    Height => ["Tall"],
    Weight => ["Fat", "Huge"],
  },
  Elephant => {
    Colour => ["Grey"],
    Height => ["Really Big"],
    Weight => ["Fat", "Medium", "Thin"],
  },
}

私がやろうとしていること

以下のプログラムは、データ構造全体を出力します。こういう使い方をしたい

my %h;

for my $animal (keys %h) {
   print "$animal\n";
   for my $attribute ( keys %{$h{$animal}} ) {
        print "\t $attribute\n";
        for my $i (0 .. $#{$h{$animal}{$attribute}} ) {
            print "\t\t$h{$animal}{$attribute}[$i]\n";
        }    
   }   
}          

私が抱えている問題

データ構造の特定の部分にアクセスしようとしています。たとえば、この例では他の属性をHeight気にしないため、各動物の配列のみを出力したいと考えています。ColourWeight

これには簡単な答えがあると確信しており、Heightパーツを指定する必要があることはわかっていますが、それを行う正しい方法は何ですか? 私は成功せずにうまくいくと思った複数の方法を試しました。

4

5 に答える 5

2

あなたのコードでは、すべての属性をループする代わりに

for my $attribute ( keys %{ $h{$animal} } ) { ... }

興味のあるものを使用してください。このように

for my $animal (keys %h) {
   print "$animal\n";
   for my $attribute ( 'Height' ) {
        print "\t $attribute\n";
        for my $i (0 .. $#{$h{$animal}{$attribute}} ) {
            print "\t$h{$animal}{$attribute}[$i]\n";
        }    
   }   
}          

インデックスではなく、heights 配列の内容をループすることを選択し、コードを次のようにします。

for my $animal (keys %h) {
    print "$animal\n";
    print "\t\t$_\n" for @{ $h{$animal}{Height} };
}          
于 2013-04-18T10:27:52.433 に答える
1

変数の名前が %h であると仮定すると、次のようになります。

foreach my $animal (keys %h) {
   my $heights = $h{$animal}->{Height}; #gets the Height array
   print $animal, "\n";
   foreach my $height( @$heights ) {
      print "  ", $height, "\n";
   }
}
于 2013-04-18T09:57:07.220 に答える
0

私はそれを解決し、私が間違っていたことを発見したと思いますか?

これは私がそうあるべきだと思う方法です:

my %h;

for my $animal (keys %h) {
      print "$animal\n";
      for my $i (0 .. $#{$h{$animal}{Height}} ) {
          print "\t\t$h{$animal}{Height}[$i]\n";
      }    
}   
于 2013-04-18T10:28:34.633 に答える