2016-09-08 18 views
0

ハッシュを含む配列を使用している人の例はあまりないようです。 私はサブで構築している配列をチェックしたいのですが、構造にアクセスする際にいくつか問題があります。おそらく私はそれが存在する方法を想像していないでしょう。これは、いくつかのコードの例です:Perl:ハッシュ配列の印刷方法

#!/usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 


my (%data, %data2, @holding); 

%data = (
    'monday' => "This stuff!", 
    'tuesday' => "That stuff!!", 
    'wed' => "Some other stuff!!!" 
    ); 

push @holding, %data; 

%data2 = (
    'monday' => "Yet more stuff... :-P ", 
    'tuesday' => "Some totally different stuff!", 
    'wed' => "What stuff is this?" 
    ); 

push @holding, %data2; 

foreach my $rows(@holding){ 
    foreach my $stuff (keys %{$holding[$rows]}){ 
     print "$holding[$rows]{$stuff}\n"; 
    } 
} 

私が取得エラーメッセージ:

Argument "wed" isn't numeric in array element at /home/kingram/bin/test line 27. 
Can't use string ("wed") as a HASH ref while "strict refs" in use at /home/kingram/bin/test line 27. 

Perlで配列を持つ私の仕事は広範囲ではありませんので、私は、私は基本的な何かが欠けていると確信しています。私はダンパーを使用する場合

私は、2つの異なる行を表現VAR1とVAR2を期待していますが、私はあなたが参照して作業する必要がある

$ ~/bin/test 
$VAR1 = [ 
      'wed', 
      'Some other stuff!!!', 
      'monday', 
      'This stuff!', 
      'tuesday', 
      'That stuff!!', 
      'wed', 
      'What stuff is this?', 
      'monday', 
      'Yet more stuff... :-P ', 
      'tuesday', 
      'Some totally different stuff!' 
     ]; 

答えて

5

を取得します。ハッシュを配列にプッシュすると、フラットなリストに過ぎません。あなたのループで正しい逆参照演算子を使用していますが、押すときにバックスラッシュ\がありません。

push @holding, \%data; 

バックスラッシュ\はあなたのスカラー値である%dataへの参照を与えます。それはあなたの配列にプッシュされます。

説明はperlreftutを参照してください。


あなたは2つのpush操作の後@holdingを見れば、それは何が起こるかは明らかです。

あなたは、データ構造の権利を取得した場合でも
use Data::Printer; 
p @holding; 

__END__ 
[ 
    [0] "monday", 
    [1] "This stuff!", 
    [2] "tuesday", 
    [3] "That stuff!!", 
    [4] "wed", 
    [5] "Some other stuff!!!", 
    [6] "wed", 
    [7] "What stuff is this?", 
    [8] "monday", 
    [9] "Yet more stuff... :-P ", 
    [10] "tuesday", 
    [11] "Some totally different stuff!" 
] 
+1

Ah。右。私は "\"を誤解していた。 その洞察に感謝します。かなり単純で、非常に基本的で、最も重要です。 –

1

、このコードはまだ仕事に行くされていません。

foreach my $rows(@holding){ 
    foreach my $stuff (keys %{$holding[$rows]}){ 
     print "$holding[$rows]{$stuff}\n"; 
    } 
} 

あなたの配列を反復処理するためにforeach my $rows (@holding)を使用する場合、ループ$rowsラウンドごとの時間が含まれています配列の要素ではない要素のインデックス。だから、$holding[$rows]でそれを見上げる必要はありません。コードは次のようになります。

foreach my $rows (@holding){ 
    foreach my $stuff (keys %{$rows}){ 
     # $rows will contain a hash *reference*. 
     # Therefore use -> to access values. 
     print "$rows->{$stuff}\n"; 
    } 
}