2011-02-10 7 views
1

배열 배열을 만든 다음 참조하려고합니다. perl - 배열 배열을 이해하는 데 문제가 있습니다.

내가 somethign 같은합니다 왜 두 번째
$array->[x]->[y]; 

그러나 이해가 안 ->이 필요 :

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] $ array가 참조이므로 이해합니다. 하지만 $ array -> [x] 배열이 아닌가요? 왜 작동하지 않는 이유는 무엇입니까?

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

정확히 어떤 배열이 아직 채워지지 않았습니까? $ i, foo ($ bar)가 포함 된 배열이 아닌 것 같습니다.

배열에 대한 참조 배열에 대한 참조를 위해 $ array -> [x] -> [y]는 어떻게 다릅니 까? ?

답변

4

설명한다 (등 ${$array}[x][y] 정확히 동일 함) $array->[x][y] 정확히 동일하다.

모든 거래는 다음과 같습니다. 모든 Perl 배열 값과 해시 값은 스칼라 여야합니다. 즉, 문자열, 숫자 또는 배열/해시 참조 (일반 오래된 배열이나 해시가 아닙니다)를 의미합니다.

따라서 첫 번째 -> 연산자는 배열을 역 참조하고 x 번째 행에옵니다. 여기에는 배열이 아니라 배열 참조가 있습니다. 따라서 여기에있는 데이터를 얻으려면 이론적으로 또 다른 -> 연산자가 필요합니다.

하지만 이걸 받으십시오. Perl은 똑똑합니다. 하나의 배열이나 해시 액세스 후에 다른 액세스가 발생하면 이것이 가능한 유일한 방법은 배열/해시 참조를 사용하는 것입니다 (첫 번째 배열/해시 액세스가 스칼라를 반환해야하기 때문에)! 결국 두 번째 화살표가 필요하지 않습니다.

자세한 내용은 perldata을 참조하십시오.

+0

고마워, 어떤 이유로 나는 배열 배열을 가질 수 있다고 믿게되었지만 실제로는 참조 배열이다. – kiasectomondo

2

하면은

push @array, [@row]; 

는 배열에 참조 미는 경우. 이것은 배열이 병합된다는 Perl의 규칙 때문에 필요합니다. 따라서 $ array -> [x]는 행 배열 자체에 대한 것이 아니라 행 배열에 대한 참조입니다. 그러나 아래 첨자 사이에 화살표는 선택 사항입니다. 그래서 $array->[x]->[y]

이 모두 실제로, 제 -> 필요하지 않은 Perl reference tutorial

+0

참조를 푸시하는 경우 각 행이 여전히 다른 이유는 무엇입니까? 그들은 똑같은 말을해서는 안됩니까? – kiasectomondo

+1

@kiasectomondo : 매번 익명의 새로운 참조를 만들고 있습니다. 매번'\ @ array'를 (동일한'@ 배열 '에 대해) 밀어 넣었다면 똑같은 것을 참조 할 것입니다. –

+1

@kiasectormondo =>'@ row' 배열을 루프 밖에서 선언하고'\ @ row'를 통해 참조를 취한 경우 행은 똑같은 것을 참조 할 것입니다. '[@row]'구문은 배열의 얕은 사본을 생성하고 새로운 참조를 반환합니다. 귀하의 경우 루프 내부에'my @ row'를 선언 했으므로'\ @ row' 만 사용할 수 있습니다. 그러면 잘 작동합니다. –

관련 문제