2011-12-22 3 views
1

"배열 배열"에 대한 다음 예제를 읽었습니다. AOA는 2 개 차원 어레이배열 배열 액세스 정보

다음 코드 세그먼트 인덱스와 전부를 인쇄 주장 심판

for $aref (@AoA) { 
    print "\t [ @$aref ],\n"; 
} 

다음 코드 세그먼트에 전부 인쇄 항이다

for $i (0 .. $#AoA) { 
    print "\t [ @{$AoA[$i]} ],\n"; 
} 

여기에 $ aref 란 무엇입니까? @$aref@{$AoA[$i]}의 정의를 이해하는 방법은 무엇입니까? 감사.

+4

[perldoc perldata] (http://perldoc.perl.org/perldata.html) 및 [perldoc perlref] (http://perldoc.perl.org/perlref.html)를 읽어보십시오. – Ether

답변

5

$aref은 "어레이 참조", 즉 어레이에 대한 참조를 나타냅니다.

my $my_aref = \@somearray; 

다음 구문을 사용하여 배열을 참조로 배열 할 수

@{$my_aref} 

@{$my_aref}@somearray이다. (그것은 실제로 동일한 배열, 사본이 아니다.) 예에서는 제

, $AoA[$i] 동일한 구문 역 참조하면 배열 기준이며 : @{$AoA[$i]}.

자세한 설명 및 예는 perlreftut을 참조하십시오.

1

"배열 배열"은 실제로 배열 배열이 아닙니다. 더 많은 배열 참조 배열입니다. 기본 배열의 각 요소는 다른 배열에 대한 참조입니다. 따라서 기본 배열의 요소를 순환하려면 배열 참조를 가져옵니다. 이것들은 첫번째 루프에서 $aref에 할당됩니다. 그들은 @ 기호로 선행 보류하여 참조 해제되므로 @$aref$aref 배열 참조에서 참조하는 배열입니다.

두 번째 루프에는 동일한 종류의 것이 작동합니다. $AoA[$i]은 배열 참조 인 @AoA 배열의 $i 번째 요소입니다. 심볼을 @ 기호로 미리 참조하여 참조 해제하고 (명확성을 위해 {}을 추가하고 우선 순위를 위해) @{$AoA[$i]}$AoA[$i] 배열 참조에서 참조하는 배열을 의미합니다.

1

Perl에는 다차원 배열이 없습니다. 하나는 동일한 결과를 얻기 위해 배열을 다른 배열에 배치합니다.

글쎄, 거의. 배열 (및 해시) 값은 스칼라이므로 다른 배열에 배열을 배치 할 수 없습니다. 배열 대신 참조을 대신 입력하십시오.

즉, "배열 배열"은 "배열에 대한 참조 배열"의 약자입니다. @AoA의 각 값은 2 차원 배열의 "환상"이 주어지면 다른 배열에 대한 참조입니다.


참조 번호는 [ ] 또는 이와 동등한 것으로부터 왔습니다. [ ]은 익명 배열을 만든 다음 해당 배열에 대한 참조를 만든 다음 참조를 반환합니다. 그것이 참조가 나오는 곳입니다.AOA 구축

일반적인 방법 :

my @AoA = (
    [ 'a', 'b', 'c' ], 
    [ 'd', 'e', 'f' ], 
); 

my @AoA; 
push @AoA, [ 'a', 'b', 'c' ]; 
push @AoA, [ 'd', 'e', 'f' ]; 

my @AoA; 
$AoA[$y][$x] = $n; 

$AoA[$y][$x] = $n; 

$AoA[$y]->[$x] = $n; 

에 대한 짧은 있다는 사실을 숙지하고 autovivification에 다음과 같은 감사와 동등의 :

($AoA[$y] //= [])->[$x] = $n; 
1

perl에서 다차원 구조가있는 전체적인 수수께끼는 다루는 변수가 세 가지 유형이라는 것을 알게되면 매우 쉽게 이해할 수 있습니다. 스칼라, 배열 및 해시.

  • 스칼라는 단일 값이며, 약 아무것도 포함 할 수 없지만 그 당시에는 하나만 포함 할 수 있습니다.
  • 배열에는 일련의 스칼라 값이 포함되어 있으며 고정 숫자 숫자 순으로 정렬됩니다.
  • 해시에는 문자열로 만들어진 키로 인덱싱 된 스칼라 값이 들어 있습니다.

모두 배열, 해시 또는 스칼라가 이러한 방식으로 작동합니다. 다중 차원 배열은 단일 차원과 다릅니다.

perldata는 매우 간결하게 표현된다

펄의 모든 데이터는 스칼라 스칼라의 어레이 또는 스칼라 해시이다. 스칼라에는 숫자, 문자열 또는 참조와 같이 세 가지 다른 값 중 하나에 단일 값이 포함될 수 있습니다. 일반적으로 형식에서 다른 형식으로의 변환은 투명합니다. 스칼라 은 여러 값을 직접 보유하지 않을 수도 있지만 배열 또는 해시가 복수 값을 포함하는 에 대한 참조를 포함 할 수 있습니다. 예를 들어

:

my @array = (1, 2, 3); 

여기, $array[0] 1 포함

, $array[1] 2 당신이 기대하는 것처럼 등이 포함되어 있습니다.

my @aoa = ([ 1, 2, 3 ], [ 'a', 'b', 'c' ]); 

여기서, $array[0]에는 배열 참조가 들어 있습니다. 인쇄 할 경우 ARRAY(0x398a84)과 같이 표시됩니다. 걱정마! 그것은 여전히 ​​스칼라 가치입니다. 우리는 이것을 어떻게 알 수 있습니까? 배열에는 스칼라 값만 포함될 수 있기 때문입니다. 우리가

for $aref (@AoA) { 
    print $aref; # prints ARRAY(0x398a84) or similar 
} 

같은 작업을 수행 할 때

그것은

for $number (@array) { 
    print $number; 
} 

$aref$number는 스칼라 값이다하고 다르지 없습니다. 여태까지는 그런대로 잘됐다.잠시 시간을내어이 지식을 잠급니다. 배열에는 스칼라 값만 포함 할 수 있습니다. 이제


, 다음 부분은 단순히 참조 처리하는 방법을 알고있다. 이 내용은 perlrefperlreftut에 설명되어 있습니다.

참조는 스칼라 값입니다. 그것은 메모리에있는 위치에 대한 주소입니다. 이 위치에는 일부 데이터가 들어 있습니다. 실제 데이터에 액세스하려면 참조를 참조 해제해야합니다.

간단한 예로서

: 기준 앞의 인장 추가

my @data = (1, 2, 3); 
my $aref = \@data; # The backslash in front of the sigil creates a reference 
print $aref;   # print something like ARRAY(0xa4b6a4) 
print @$aref;  # prints 123 

는 인장가 나타내는 데이터 형식에 스칼라 값을 참조 해제 펄 말한다. 이 경우 배열. 위, 우리가 특정 명명 된 위치에 대한 참조를 가지고있는 예에서

Not a HASH reference 

: 당신이 참조의 유형에 대한 잘못된시길을 선택하면, 펄과 같은 오류를 제공 할 것입니다. @$aref@data 모두 동일한 값에 액세스합니다. 하나의 값을 변경하면 메모리 위치에 대한 주소가 동일하기 때문에 둘 다 영향을받습니다. 사용해보기 :

my @data = (1, 2, 3); 
my $aref = \@data; 
$$aref[1] = 'a';   # dereference to a scalar value by $ sigil 
# $aref->[1] = 'a'  # does the same thing, a different way 
print @data;    # prints 1a3 
print @$aref;   # prints 1a3 

우리는 익명 데이터를 가질 수도 있습니다. 우리가 배열의 배열을 구축에만 관심이 있다면, 우리는 @data에 관심이없는 것, 그리고이 일을하여 건너 뛸 수 :

my $aref = [ 1, 2, 3 ]; 

번호 목록 주위의 괄호는 익명의 배열을 만들 수 있습니다. $aref에는 여전히 동일한 유형의 데이터가 있습니다. 참조. 그러나이 경우에는 $aref이 메모리 위치에 포함 된 데이터에 액세스하는 유일한 방법입니다. 지금,이 같은 좀 더 스칼라 값을 만들어 보자 :

my $aref1 = [ 1, 2, 3 ]; 
my $aref2 = [ 'a', 'b', 'c' ]; 
my $aref3 = [ 'x', 'y', 'z' ]; 

우리는 이제 익명의 배열에 대한 참조를 포함하는 세 개의 스칼라 변수가 있습니다. 우리가 이것을 배열에 넣으면 어떨까요? @{ ... } : 우리가 $aref1에 액세스하려면 싶다면

my @aoa = ($aref1, $aref2, $aref3); 

, 우리는 print @$aref1을 할 수 있지만, 우리는 또한이 경우
print @{$aoa[0]}; 

을 할 수있는, 우리는 역 참조의 확장 양식을 사용합니다. perl은 모호성을 좋아하지 않으므로 @{$aoa[0]} (참조로 $aoa[0]을 참조하고 참조로 참조) 및 @{$aoa}[0] (참조를 $aoa으로 가져와 배열로 역 참조하고 해당 배열을 첫 번째 값으로 취해야 함)을 구분해야합니다.

위의 경우 @{$aref}@$aref과 동일하게 사용할 수 있습니다.

따라서 배열 배열을 만드는 데만 관심이 있다면 $aref1 스칼라 중 하나에 관심이 없습니다. 그럼 과정에서 자르겠습니다.

my @aoa = ([ 1, 2, 3 ], [ 'a', 'b', 'c' ], [ 'x', 'y', 'z' ]); 

타다! 배열 배열입니다.

이제는 되돌릴 수 있습니다. 이 배열 내부의 값에 액세스하려면 다음을 수행하십시오.

for my $scalar (@aoa) { 
    print @$scalar; # prints 123abcxyz 
} 

이번에는 점을 만들기 위해 다른 변수 이름을 사용했습니다. 이 루프는 각 값을 @aoa (여전히 스칼라 값임)에서 취하여 배열로 역 참조하여 인쇄합니다.

아니면 액세스 할 수 있습니다 @aoa 해당 인덱스

for my $i (0 .. $#aoa) { 
    print @{$aoa[$i]}; 
} 

을 통해 그리고 그게 전부입니다!