2016-07-26 12 views
0

入れ子になった配列を定義し、配列をループして出力する次のコードがあります。私は内部配列を抽出するためにコメントアウトされた行を使用したいと思いますが、内部配列を平坦化するので機能しません。代わりに次の3行を使用する必要があります。コメントアウトされた行を正しく動作させるにはどうすればよいですか?入れ子配列から内部配列を抽出するにはどうすればいいですか?

use Data::Dumper;  
my @arr1; 
for $i (0..9) 
{ 
    my @arr2; 
    my @arr3; 
    for $j ('A'..'D') { 
     push @arr2, $j; 
     push @arr3, int(rand(100)); 
    } 
    push @arr1, [$i, \@arr2, \@arr3]; 
} 
for $linkarray (@arr1) { 
    #my ($i, @arr2, @arr3) = @$linkarray; 
    my $i = @$linkarray[0]; 
    my @arr2 = @$linkarray[1]; 
    my @arr3 = @$linkarray[2]; 
    print "i: $i\narr2: " . Dumper(@arr2) . "\narr3: " . Dumper(@arr3) . "\n"; 
} 
+0

あなたは解凍時に使用すると、配列、配列参照をしませ集める必要がありますので、あなたは、配列の参照に押し込みます。 – xxfelixxx

+0

http://perldoc.perl.org/perldsc.html – xxfelixxx

+0

これらの参照を通常の配列のように使用するにはどうすればよいですか? – CJ7

答えて

1

問題が発生した場合、あなたは参照を返しブロックで名前を置き換え、その後、名前の配列でそれを行うだろうか見つけ出します。

名前付き配列の場合は$a[0]の場合、配列への参照は${REF}[0]です。

名前付き配列の場合は@aなら、配列への参照は@{REF}です。

Easy!

my $i = ${ $linkarray }[0]; 
my @arr2 = @{ ${ $linkarray }[1] }; 
my @arr3 = @{ ${ $linkarray }[2] }; 

ただし、以下では読みやすいです。さらに

my $i = $linkarray->[0]; 
my @arr2 = @{ $linkarray->[1] }; 
my @arr3 = @{ $linkarray->[2] }; 

、あなたが本当にそのようなものを配列のコピーを作成するべきではありません。むしろ無駄です。参考文献と一緒に作業してください。

my $i = $linkarray->[0]; 
my $arr2 = $linkarray->[1]; 
my $arr3 = $linkarray->[2]; 

最後に、次のように簡略化:

my ($i, $arr2, $arr3) = @$linkarray; 

参照:

関連する問題