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
는 스칼라 값이다하고 다르지 없습니다. 여태까지는 그런대로 잘됐다.잠시 시간을내어이 지식을 잠급니다. 배열에는 스칼라 값만 포함 할 수 있습니다. 이제
, 다음 부분은 단순히 참조 처리하는 방법을 알고있다. 이 내용은 perlref 및 perlreftut에 설명되어 있습니다.
참조는 스칼라 값입니다. 그것은 메모리에있는 위치에 대한 주소입니다. 이 위치에는 일부 데이터가 들어 있습니다. 실제 데이터에 액세스하려면 참조를 참조 해제해야합니다.
간단한 예로서
: 기준 앞의 인장 추가
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]};
}
을 통해 그리고 그게 전부입니다!
[perldoc perldata] (http://perldoc.perl.org/perldata.html) 및 [perldoc perlref] (http://perldoc.perl.org/perlref.html)를 읽어보십시오. – Ether