2016-09-09 7 views
0

xmlから読み込んだパーツスクリプトを1つのサブのハッシュに分解し、ハッシュの配列を出力してから、メインから2番目のサブを呼び出して配列を処理するハッシュのPerl:サブルーチンに渡されたハッシュの配列へのアクセス

Data :: Dumperは、すべてが正しく渡されていることを示します。

なぜ私は現在ハッシュにアクセスできないのか分かりません。

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

my (@sortedData, $value1, $value2); 
use subs qw(processData outputData); 

@sortedData = processData; 
outputData($value1, $value2, \@sortedData); 

sub processData{ 
    # Example code 
    # # Does some processing of xml that results in a hash. 
    # # That series of hashes is pushed onto an array 
    my ($item, @results); 

    # foreach $item (@{ $rss->{items}){ 
    # my %data = (
    #  'first' => $item->{'value'}, 
    #  'second' => $item->{'value'}, 
    #  'third' => $item->{'value'} 
    # ); 

    # push @results, \%data; 
    # } 
    # Essentially the hash is : 

    @results = (
     {'data1'=>810,'data2'=>153,'data3'=>215}, 
     {'data1'=>160,'data2'=>220,'data3'=>604}, 
     {'data1'=>940,'data2'=>103,'data3'=>115}, 
     {'data1'=>100,'data2'=>319,'data3',525}, 
     {'data1'=>500,'data2'=>803,'data3'=>650} 
     ); 
    return @results; 
} 

sub outputData{ 
    my ($input1, $input2, @localData) = @_; 
    print Dumper @localData; 

    print "\@localData: " . @localData . "\n"; 
    foreach my $i (@localData){ 
    # foreach my $j ($i){ 
    #  print $i . "\n" . $j . "\n"; 
    # } 
     print "\$i: " . $i . "\n"; 
    } 
} 

出力:

$VAR1 = [ 
      { 
      'data3' => 215, 
      'data2' => 153, 
      'data1' => 810 
      }, 
      { 
      'data3' => 604, 
      'data2' => 220, 
      'data1' => 160 
      }, 
      { 
      'data2' => 103, 
      'data3' => 115, 
      'data1' => 940 
      }, 
      { 
      'data1' => 100, 
      'data3' => 525, 
      'data2' => 319 
      }, 
      { 
      'data1' => 500, 
      'data3' => 650, 
      'data2' => 803 
      } 
     ]; 
@localData: 1 
$i: ARRAY(0x80071b30) 

@localDataの値が1であるか、なぜ@localDataの要素の参照ではなく、HASHのARRAYである理由私は理解していません。

私は確かに初めてPERLアレイについて深く理解しています。 私は思ったほどそれを理解しません。

+0

*スカラーの配列に*参照*を渡して '@ localData'に代入し、' $ localData [0] 'に参照を入れます。 – ikegami

答えて

3

参照をサブ配列の配列に渡してから、この単一のスカラーを@localDataに割り当てます。修正:

sub outputData{ 
    my ($input1, $input2, $localData) = @_; 
    print Dumper $localData; 

    print "\@localData: " . @$localData . "\n"; 
    foreach my $i (@$localData){ 
     ... 
    } 
} 
+0

ありがとうございます。完璧なポイント。参照コンテキストは明らかに私にとってはまだ非常に不安定です。これは、今後の学習に焦点を当てるのに役立ちます。 –

関連する問題