2011-02-10 13 views
1

配列の配列を作成して参照しようとしています。perl - 配列の配列の理解に問題があります

私はsomethignのようにする:

sub foobar 
{ 
my @array; 
my $i; 
for ($i = 0; $i < 1000; $i=$i+1) 
{ 
    my @row; 
    $row[0] = $i; 
    $row[1] = foo($bar); 
    push @array , [@row]; 
} 
return \@array; 
} 

私は経由して値を取得することができます秒なぜ私は理解していないが

$array->[x]->[y]; 

- >が必要とされています。 $ array - > [x] $ arrayは参照のため、私は理解しています。しかし、$ array - > [x]は配列ではありませんか?なぜ、これは動作しません:

my @notarray = $array->[x]; 

正確には配列が現在ではありません。 $ I、foo($ bar)を含む配列ではないようです。

$ array - > [x] - > [y]は、配列への参照配列?

答えて

4

に説明されて

(など、まさに${$array}[x][y]と同じである)$array->[x][y]と全く同じです。

すべてのPerl配列の値とハッシュ値はスカラーでなければなりません。これは、文字列、数値、または配列/ハッシュ参照のいずれかを意味します(単純な古い配列やハッシュではありません)。

したがって、最初の->演算子は配列を逆参照し、x行目に取得します。そこには、配列ではなく配列参照があります。したがって、そこのデータにアクセスするには、理論的には別の->演算子が必要です。

これを取得します。 Perlはスマートです:1つの配列またはハッシュアクセス後に別のアクセスが発生した場合、これが可能な唯一の方法は配列/ハッシュリファレンスによるものです(最初の配列/ハッシュアクセスはスカラーを返さなければなりません)。結局のところ、第二の矢は必要ありません。

詳細はperldataを参照してください。

+0

ありがとう、何らかの理由で、私は配列の配列を持つことは可能だと信じてきましたが、実際には配列の配列です。 – kiasectomondo

2

あなた

push @array, [@row]; 

あなたは配列へ参照を推進しています。これは、配列が平坦化されるというPerlの規則のために必要です。したがって、$ array - > [x]は行配列への参照であり、行配列自体への参照ではありません。ただし、下付き文字の間に矢印はオプションです。だから、$array->[x]->[y]これは、全ての第2 ->が実際に、必要とされていないPerl reference tutorial

+0

私は参照をプッシュしている場合、なぜ各行がまだ異なるのですか?彼らは同じことを参照してはならないのですか? – kiasectomondo

+1

@kiasectomondo:毎回新しく匿名のリファレンスを作成しています。たびたび '\ @ array'を(同じ' @配列 'のために)プッシュすると、同じことを参照します。 –

+1

@kiasectormondo => '@ row'配列をループの外に宣言し、' \ @ row'を介して参照すると、行は同じことを参照します。 '[@row]'構文は、配列の浅いコピーを作成し、新しい参照を返します。あなたのケースでは、ループの中で 'my @ row'を宣言しているので、' \ @ row'だけ使うことができ、うまく動作します。 –