2017-06-21 38 views
0

配列 - どのように動的に逆参照配列ですか?私が行うと(Perlの)

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

get_return機能は、任意の要素のリストを返します。 この場合、get_returns関数は2つの配列のリストを返します。しかし、2つの配列を分割する代わりに、戻り値のすべての内容をarray1に格納します。

@{$arr}のような明示的なものを使用して呼び出す関数で配列を逆参照する方法がわかりません。私は、RPCの呼び出しの形式を行っているところでは、戻り値(とその型)はプログラムによってあらかじめ知られていません。私はまた、関数呼び出しの外で配列を逆参照する必要はありません。 アレイを動的に逆参照するための回避策はありますか?

更新

get_returns機能では、私は、サーバーからの応答を送信し、受信しています。

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

'get_returns()'関数のコードで質問を更新してください。 – stevieb

+0

@stevieb、私は質問 – user2309843

+0

を更新しました。これは返されている単一のリストです。それは何ですか? 'Use Data :: Dumper;私の@ret = get_returns(); print Dumper \ @ret; 'show? – stevieb

答えて

4

get_returns関数は2つの配列のリストを返す:これは、「戻る」フィールドは、リターンの配列であるJSONテーブルを返します。

いいえ、いくつかのスカラーを返します。それはサブが返すことができる唯一のものです。この特定の場合、配列への2つの参照を返します。

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); 

これはお勧めしません。

+0

この解決策は間違いなく機能します。私は主に、ユーザーが機能を呼び出す方法を変更する必要がないことを望んでいました。 Perlユーザがmy(@ array1、@ array2)= get_returnsの代わりにmy($ array1、$ array2)= get_returns()のようなことをするのは普通ですか? – user2309843

+1

「配列の返り値」とは何を意味するのか分かりませんが、 'my($ array1、$ array2)= get_returns()'は非常に一般的です。 – ikegami

+1

@ d33これらは*配列参照であり、配列ではなく返されます。そして、ikegamiが示したものは非常に一般的です。これは、 'my @a = get_returns();'のようにして、 '$ a [0]'にaref1を入れ、 '$ a [1]'にaref2を入れることもできます。そして、あなたは '$ a [0] - > [0]'または 'for {@ {$ a [0]}){...}'のようにderefすることができます。コードを理解しやすくするものは、ここに行く方法です。 – stevieb

1

Data::DumperのOPに出力されたコメントには、$VAR1 = [['e1', 'e2'], ['e1', 'e2']]が含まれています。これは配列参照の配列です。

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]; 
関連する問題