Perl: как получить доступ к массиву хэшей, переданных подпрограмме

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

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 является МАССИВ, а не ХЭШ.

Я определенно впервые проверяю свое более глубокое понимание массивов PERL. Я не так понимаю это, как думал.


person Ken Ingram    schedule 09.09.2016    source источник
comment
Вы передаете ссылку в массив (скаляр) и присваиваете ее @localData, помещая ссылку в $localData[0].   -  person ikegami    schedule 10.09.2016


Ответы (1)


Вы передаете ссылку на массив подпрограмме, а затем назначаете этот единственный скаляр @localData. Исправить:

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

    print "\@localData: " . @$localData . "\n";
    foreach my $i (@$localData){
       ...
    }
}
person ikegami    schedule 09.09.2016
comment
Спасибо. Идеальная точка. Референтный контекст явно все еще очень шаткий для меня. Это помогает мне выбрать направление для дальнейшего изучения. - person Ken Ingram; 10.09.2016