Perl传递来自Foreach循环的子例程的哈希引用(哈希数组)

Raj*_*aja 1 perl hash perl-module subroutine

这可能对你来说非常简单,但我已经尝试了一个多小时.

好的..这是我的代码,

@collection = [
{
            'name' => 'Flo',
            'model' => '23423',
            'type' => 'Associate',
            'id' => '1-23928-2392',
            'age' => '23',
},
{
            'name' => 'Flo1',
            'model' => '23424',
            'type' => 'Associate2',
            'id' => '1-23928-23922',
            'age' => '25',
}];

foreach my $row (@collection) {
  $build_status = $self->build_config($row);
}

sub build_config {
    my $self = shift;
    my %collect_rows = @_;
    #my %collect_rows = shift;

    print Dumper %collect_rows; exit;
    exit;
}
Run Code Online (Sandbox Code Playgroud)

$ row真的是哈希.但是当我打印它..它给出如下输出(我正在使用Dumper),

$VAR1 = 'HASH(0x20a1d68)';
Run Code Online (Sandbox Code Playgroud)

ste*_*ieb 5

您使用散列和数组混淆了引用.

声明一个数组:

my @array = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

哈希声明为:

my %hash = (1 => 2, 3 => 4);
Run Code Online (Sandbox Code Playgroud)

这是因为哈希和数组都只是列表(花哨列表,但我离题).您需要使用的唯一时间,[]并且{}您希望使用列表中包含的值,或者您想要创建任一列表的引用(更多信息如下).

请注意,=>它只是一个特殊的(即胖)逗号,引用左侧,所以虽然它们做同样的事情,但%h = (a, 1)会破坏,%h = ("a", 1)工作正常,并且%h = (a => 1)也可以正常工作,因为它a被引用.

数组引用声明如下:

my $aref = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

...请注意,您需要将数组引用放入标量中.如果你不这样做,那就这样做:

my @array = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)

...引用被推到第一个元素上@array,这可能不是你想要的.

哈希引用声明如下:

my $href = {a => 1, b => 2};
Run Code Online (Sandbox Code Playgroud)

[]当你使用它来使用元素时,在数组(而不是aref)上使用的唯一时间是:$array[1];.与哈希一样,除非它是一个引用,否则你只能{}用来获得一个键的值:$hash{a}.

现在,为了解决您的问题,您可以继续使用带有这些更改的引用:

use warnings;
use strict;

use Data::Dumper;

# declare an array ref with a list of hrefs

my $collection = [
    {
        'name' => 'Flo',
        ...
    },
    {
        'name' => 'Flo1',
        ...
    }
];

# dereference $collection with the "circumfix" operator, @{}
# ...note that $row will always be an href (see bottom of post)

foreach my $row (@{ $collection }) {
    my $build_status = build_config($row);
    print Dumper $build_status;
}

sub build_config {
    # shift, as we're only accepting a single param...
    # the $row href

    my $collect_rows = shift;
    return $collect_rows;
}
Run Code Online (Sandbox Code Playgroud)

...或将其更改为使用非参考:

my @collection = (
    {
        'name' => 'Flo',
        ...
    },
    {
        'name' => 'Flo1',
        ...
    }
);

foreach my $row (@collection) {
    my $build_status = build_config($row);

    # build_config() accepts a single href ($row)
    # and in this case, returns an href as well

    print Dumper $build_status;
}

sub build_config {
    # we've been passed in a single href ($row)

    my $row = shift;

    # return an href as a scalar

    return $row;
}
Run Code Online (Sandbox Code Playgroud)

我写了一篇关于Perl参考的教程,您可能对Perl参考指南感兴趣.还有perlreftut.

最后一点......哈希是{}在数组内部声明的,因为它们确实是哈希引用.对于多维数据,只有Perl中结构的顶层可以包含多个值.下面的所有其他内容必须是单个标量值.因此,您可以拥有一个哈希数组,但从技术上和字面上来说,它是一个包含标量的数组,其值是另一个结构的指针(引用).指针/引用是单个值.