2016-09-09 3 views
0

Имейте скрипт perl, читающий из xml, разбор данных в хэши в одном суб, выводящий массив хэшей, а затем из главного вызова второго подпроцесса для обработки массива хешей.Perl: Как получить доступ к массиву хэшей, переданному подпрограмме

Данные :: Дампер показывает, что все проходит должным образом.

Имея страшное время, выясняя, почему я не могу теперь получить доступ к хэшам.

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 является ARRAY вместо HASH.

Я, конечно, впервые тестирую свое более глубокое понимание массивов 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

Спасибо. Идеальная точка. Справочный контекст явно все еще очень шаткий для меня. Это помогает мне выбрать фокус для дальнейшего изучения. –

Смежные вопросы