2016-10-14 6 views
1

以下のコードの出力は常に空です。私が間違っていることを確かめず、助けに感謝します。どのようにして、ハッシュの配列内の特定のハッシュのキーの値に到達するのですか?Perl:ハッシュの配列をスライスする

use strict; 
use warnings; 

my %dot1 = ('a'=>1,'b'=>2); 
my %dot2 = ('a'=>3,'b'=>4); 
my %dot3 = ('a'=>5,'b'=>6); 
my %dot4 = ('a'=>7,'b'=>8); 

my @array = (%dot1,%dot2,%dot3,%dot4); 

my %x = $array[2]; 
my $y = $x->{'a'}; 

print "$y \n"; 
+0

コードに構文エラーがあります。 – simbabque

+0

このコードでコンパイルエラーが発生するはずです。 'x'はハッシュであり、ハッシュリファレンスではありません。また、 'array'は4つのハッシュ参照の配列ではありません。それは16個のスカラの配列です。 – chepner

+1

'@ array'はハッシュの配列ではありません。フラットな16要素配列です。 – aschepler

答えて

4

ハッシュリファレンスの配列が必要な場合は、そのように明示する必要があります。あなたが何をしたいか

my @array = (\%dot1, \%dot2, \%dot3, \%dot4); 
my %x = %{$array[2]}; 
my $y = $x{a}; 
print "$y\n"; 
+0

ありがとう@チェック者。 %{$ array [2]}の部分を理解してください。 – user110084

+0

私は '%x'に実際の' hash 'を割り当てることができるように、ハッシュリファレンスを逆参照しています。また、 '$ my x = $ array [2];でリファレンスと直接作業することもできます。 my $ y = $ x - > {a} 'となります。キーポイントは、各ハッシュの展開された内容を配列に格納するのではなく、配列にハッシュリファレンスを格納することです。 – chepner

2

は、そうでない場合はperlがリストコンテキストでハッシュを評価し、あなたの@arrayにあなたのハッシュへの参照を追加しています。

my @array = (\%dot1,\%dot2,\%dot3,\%dot4); 
my $x = $array[2]; 
my $y = $x->{'a'}; 

print "$y \n"; 
+0

ありがとう@sparkeyG。私は今問題を見る。 – user110084

+0

$ array [2]はスカラーではなく%dot2なので、私は$ xを理解しているとは限りません。また、Perlでは、配列とハッシュが0で始まらないことを確認したいのですか? – user110084

+0

'' '$ array [2]' '' 'の値は' ''% '' dot3'''への参照です(perlの配列は参照されています)。$ xは参照を含むスカラーです。 – SparkeyG

5

あなたはハッシュの配列を持っていません。ハッシュのような配列があります。キーはabの順で4回あり、比較的ランダムな順序です。

print Dumper \@array; 
$VAR1 = [ 
      'a', 
      1, 
      'b', 
      2, 
      'a', 
      3, 
      'b', 
      4, 
      'a', 
      5, 
      'b', 
      6, 
      'a', 
      7, 
      'b', 
      8 
     ]; 

その後、あなたはハッシュリファレンス$xからキーaを取るための構文である、$x->{a}を使用しているが、あなたは今までハッシュ%aを宣言しました。それはあなたが1つの値の奇妙なサイズのリストを与えるので、順番にそれは壊れます。

代わりに、ハッシュへの参照を配列に追加してください。そうすれば、フラットリストの代わりにマルチレベルのデータ構造が得られます。次に、x変数をスカラー$xにします。

my %dot1 = ('a'=>1,'b'=>2); 
my %dot2 = ('a'=>3,'b'=>4); 
my %dot3 = ('a'=>5,'b'=>6); 
my %dot4 = ('a'=>7,'b'=>8); 

my @array = (\%dot1,\%dot2,\%dot3,\%dot4); # here 


my $x = $array[2]; # here 
my $y = $x->{'a'}; 

print "$y \n"; 

これは5と表示されます。

perlrefperlreftutのデータ構造を読んでください。

+0

非常にクリアです。そして、ゼロベース部分も明確になっています。 @ simbabqueに感謝します。 – user110084

関連する問題