Perl:如何访问传递给子例程的哈希数组

时间:2016-09-09 22:12:36

标签: arrays perl hash associative-array perl-data-structures

从xml读取perl脚本,将数据解析为一个子节点中的哈希值,输出哈希数组,然后从main调用第二个子句以处理哈希数组。

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元素的引用是ARRAY而不是HASH。

我肯定是第一次测试我对PERL数组的更深入理解。 我不像我想的那样理解它。

1 个答案:

答案 0 :(得分:3)

引用传递给数组,然后将此单个标量指定给@localData。修正:

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

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