数组 - 如何动态取消引用数组? (Perl的)

时间:2017-06-21 14:23:18

标签: arrays perl

当我这样做时:

my (@array1, @array2) = get_returns();

get_return函数返回任意元素的列表。 在这种特殊情况下,get_returns函数返回两个数组的列表。但是,这会将返回的所有内容存储到array1,而不是将两个数组分开。

我不确定如何使用像@{$arr}这样的显式函数通过我调用的函数取消引用数组。我正在做一种RPC调用,其中返回(及其类型)事先不为程序所知。我也不想在函数调用之外取消引用数组。 是否有动态取消引用数组的解决方法?

更新

get_returns功能中,我正在从服务器发送和接收响应。这将返回一个JSON表,其中“returns”字段是一个返回数组:

sub get_returns {
    my $data = remotely_call_some_function();
    $t = $json->decode($data);
    my @returns = @{$t->{"returns"}};
    return @returns;
}

2 个答案:

答案 0 :(得分:4)

  

get_returns函数返回两个数组的列表。

不,它会返回一些标量。这是sub可以返回的唯一东西。在这种特定情况下,它返回两个对数组的引用。你可以按如下方式抓住它们:

my ($array1, $array2) = get_returns();
  

我也不想在函数

之外取消引用数组

要做到这一点,您需要get_returns以外的命名数组来填充get_returns

sub get_returns {
    my $data_json = remotely_call_some_function();
    my $data = $json->decode($data_json);
    my $returns = $data->{returns};
    @{ $_[0] } = $returns->[0];
    @{ $_[1] } = $returns->[1];
}

get_returns(\my @array1, \my @array2);

我建议不要这样做。

答案 1 :(得分:1)

根据OP中包含Data::Dumper输出的评论,您收到$VAR1 = [['e1', 'e2'], ['e1', 'e2']]。这是一个数组引用数组。以下是如何接收然后取消引用内部arefs:

my ($aref1, $aref2) = get_returns();

# deref and print each element of an array reference

for my $elem (@$aref1){
    print "$elem\n";
}

# get a single element

my $x = $aref2->[0];